如何在haxe中将数组初始化为给定大小

时间:2013-12-24 20:14:03

标签: arrays haxe

我想知道是否有办法将数组初始化为给定大小n(就像在c ++的std::vector构造函数中,或者@steve richey的答案,如果没有提示元素hack)?< / p>

我的想法是将n默认元素推回到新创建的数组中,但即使这样也不可能,因为似乎没有办法定义默认元素,如下面的原始问题所示: / p>

- 原始问题 -

我试图在haxe(从3.0.1开始)编写一个静态函数来创建一个给定大小为n的数组,其中包含任意类型的类型T.我无法弄清楚如何使用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 个答案:

答案 0 :(得分:5)

在Haxe中,阵列不是固定长度。您可以使用向量,其行为类似但具有固定长度。

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)上,这是一个真正的Vector,它会在边界访问之外抛出错误。在其他平台(例如JS)上,底层实现是一个数组,所以它可能不会引出错误来获取边界之外的项目等。如果你坚持使用非破坏的合理用法,你应该没问题:)

作为关于阵列的附注,如果您执行以下操作:

var arr = [];
arr[0] = "zero";
arr[8] = "eight";

某些平台会将项目1-7填入“null”,而有些则不会 - 行为取决于平台并且不可靠。

见:

答案 1 :(得分: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是一个黑客攻击,而其他人可能知道更好的方法,但希望这会有所帮助。

答案 2 :(得分: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。