Type的奇怪行为.在Haxe创建实例



下面的代码不应该抛出错误而不是执行吗?

class Weird
{
    public static function main()
    {
        var weirdPerson = Type.createInstance(Person,[["What", "the", "?"]]);
        trace(weirdPerson.likesCake);
        // Outputs [What,the,?]
        var normalPerson = Type.createInstance(Person,[true]);
        trace(normalPerson.likesCake);
        // Outputs John Doe
    }
}

class Person
{
    public var likesCake:Bool;
    public function new(?likesCake:Bool=true)
    {
        this.likesCake = likesCake;
    }
}

错误的类型被解析到weirdPerson的构造函数,但它仍然被接受。Bool属性' likeescake '的weirdPerson实际上被分配了一个字符串数组!?这里有什么问题,还是这是预期的功能?也许likesCake属性的类型在运行时从Bool更改为Array,仅适用于Person类的这个实例?

From docs for Type.createInstance:

如果cl或args为null,或者args中的元素个数与构造函数参数的期望个数不匹配,或者任何参数的类型无效,或者cl没有自己的构造函数,则结果为未指定。

基本上,当你在Haxe (TypeReflect类)中使用反射时,Haxe编译器不能保证捕获任何类型错误。在本例中,createInstance()的第二个参数的类型为Array<Dynamic>—它将接受任何类型的数组,并且不做任何检查。

在动态平台上,比如Javascript或Neko,他们可能会让你摆脱这个,你会遇到你所看到的那种错误。在静态平台(c++、Java、Flash?)上,底层平台可能会在运行时拒绝此操作。因为Haxe在平台之间不做任何保证,所以它被称为"未指定的",你应该小心你的参数。

这些"动态"反射参数会导致Haxe编译器无法追踪的非常令人沮丧的错误,所以在使用这些函数时要小心…(我昨天花了2个小时才找到一个!)

相关内容

  • 没有找到相关文章

最新更新