如何在Haxe中将数组初始化为指定大小

4
我想知道是否有一种方法可以初始化一个数组到给定的大小n,就像C++的std::vector构造函数或下面@steve richey的答案中的提示元素hack一样?我的想法是将n个默认元素推回到新创建的数组中,但即使这样似乎也不可能,因为似乎没有定义默认元素的方法,如下面的原始问题所示:
-- 原始问题 --
我正试图在Haxe(截至3.0.1)中编写一个静态函数来创建一个由任意类型T的n个元素组成的数组。我无法弄清如何正确使用Type.createEmptyInstance()。我能接近的是:
class Main {
    static public function new_array<T>(n:Int):Array<T> {
    var a:Array<T> = new Array<T>();
    var t:T = new T(); //not OK
    for (i in 0...n)
        a.push(Type.createEmptyInstance(Type.getClass(t)));
    return a;
}
    static public function main() {
            var a:Array<Int> = new_array(3);
    }
}

new_array()函数中的第二行存在问题。编译器提示:Main.hx:4: characters 12-19 : Only generic type parameters can be constructed

我的问题是,如何使这样的函数适用于任何类型T的数组。

谢谢。

3个回答

5
在Haxe中,数组不是固定长度的。相似的行为可使用Vectors替代,但具有固定长度。
class Test {
    static function main(){
        var vector = new haxe.ds.Vector(5); // Starting Length
        vector[0] = "zero";
        vector[3] = "three";
        // vector[7] = "seven"; // Will cause Runtime error on some platforms! 
        for ( val in vector ) {
            trace( val );
            // "zero"
            // null
            // null
            // "three"
            // null
        }
    }
}

请注意,向量是“抽象的”,因此它们包装了底层类型。在某些平台(例如Flash)上,这是一个真正的向量,如果超出范围访问会引发错误。在其他平台(例如JS)中,底层实现是一个数组,因此可能不会为获取超出范围的项目而引发错误等。如果您坚持使用非破碎合理的用法,那么就应该没问题 :)
顺便提一下关于数组,如果你做了这样的事情:
var arr = [];
arr[0] = "zero";
arr[8] = "eight";

一些平台会在项1-7之间填充"null",而有些平台则不会 - 这种行为取决于平台并且不可靠。

请参见:


非常感谢您的回答。但是我需要让它适用于Array<T>,因为我需要向容器中添加元素。此外,我需要的Array<T>与上述描述更像是C++ vector<>.resize()函数,可以用于初始化或重新分配C++“数组”的存储空间。 - thor

1
这里,试一下这个:
@:generic static public function new_Array<T>( ArrayType:T, Length:Int ):Array<T> {
    var empty:Null<T> = null;
    var newArray:Array<T> = new Array<T>();

    for ( i in 0...Length ) {
        newArray.push( empty );
    }

    return newArray;
}

接下来,当你想创建一个新的数组:

var myArray:Array<Int> = new_Array( 1, 25 );

不可否认,使用数字1表示类型为Int有些取巧,也许还有更好的方法,但希望这能帮到你。


0

如果你需要设置数组的长度,即使它没有任何数据,这里有一个简单的方法:

    var myArray:Array<String> = new Array<String>();   //in this case array of strings
    myArray[5] = null;                                 //in this case setting length to 6

元素0到4没有被设置(如果你调试它们不会被列出),但它们将被视为null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接