如何将Haxe数组/向量转换为另一种类型

时间:2019-04-15 22:19:51

标签: haxe

比方说,我有一些父类型的数组或向量。要将其传递给函数,我需要将其设置为某种子类型(我事先知道所有元素都必须保证是该子类型)。有方便的方法吗?现在,我只能考虑制作一个全新的阵列。

此外,它似乎也不允许我这样做:它不会在父类型的位置接受子类型的数组。是否有解决此问题的好方法?

看起来var files = $('#file')[0].files;可行,但这是首选方式吗?

1 个答案:

答案 0 :(得分:5)

  

要将其传递给函数,我需要将其设置为某种子类型(我事先知道所有元素都必须保证是该子类型)。

如果您确实确信是这种情况,那么使用cast是安全的。我认为没有什么更漂亮的方法,也不应该,因为它本质上并不美观。不得不这样做通常表明您的代码或正在使用的API中存在设计缺陷。


反之,了解为什么不安全是有帮助的。由于这种思考过程,其原因不一定像直观的那样:

  

我可以将Child分配给Base,为什么不能将Array<Child>分配给Array<Base>

此确切示例用于说明差异 in the Haxe Manual。您绝对应该完整阅读它,但是在这里我将给出一个简短的摘要:

var children = [new Child()];
var bases:Array<Base> = cast children;
bases.push(new OtherChild());

children[1].childMethod(); // runtime crash

如果您可以将Array<Child>分配给Array<Base>,则然后您可以将push()Child不兼容的类型。但是,正如您提到的,您可以再次cast使其静音,如上面的代码片段所示。

然而,这并不总是安全的-可能仍然有代码保存对该原始Array<Child>的引用,该原始childMethod()现在突然包含了意外的内容!这意味着我们可以像在没有该方法的对象上调用cast之类的操作,并导致运行时崩溃。

反之亦然,如果没有代码保留此类引用(或者如果引用是只读的,例如通过haxe.ds.ReadOnlyArray),则可以安全地使用compileJava { //disable compilation in a separate daemon process...should be faster? options.fork = false options.compilerArgs << '-Xshare:on' }


最终,要在制作副本的性能成本(根据大小可能忽略不计)与您对自己比编译器更聪明/对所有引用的了解有多自信之间进行权衡存在。