下面的代码不应该抛出错误而不是执行吗?
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 (Type
和Reflect
类)中使用反射时,Haxe编译器不能保证捕获任何类型错误。在本例中,createInstance()
的第二个参数的类型为Array<Dynamic>
—它将接受任何类型的数组,并且不做任何检查。
在动态平台上,比如Javascript或Neko,他们可能会让你摆脱这个,你会遇到你所看到的那种错误。在静态平台(c++、Java、Flash?)上,底层平台可能会在运行时拒绝此操作。因为Haxe在平台之间不做任何保证,所以它被称为"未指定的",你应该小心你的参数。
这些"动态"反射参数会导致Haxe编译器无法追踪的非常令人沮丧的错误,所以在使用这些函数时要小心…(我昨天花了2个小时才找到一个!)