【问题标题】:how to initialize an array to a given size in haxe如何在haxe中将数组初始化为给定的大小
【发布时间】:2013-12-24 20:14:03
【问题描述】:

我想知道是否有一种方法可以将数组初始化为给定大小n(就像在 c++ 的 std::vector 构造函数中,或者下面没有提示元素黑客的 @steve Richey 的答案)?

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

-- 原始问题--

我正在尝试在 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 的数组。

谢谢,

【问题讨论】:

    标签: arrays haxe


    【解决方案1】:

    在 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”,而有些则不会 - 行为取决于平台且不可靠。

    见:

    【讨论】:

    • 非常感谢您的回答。但我需要为 Array 完成这项工作,因为我需要向容器中添加元素。此外,如上所述,我需要的 Array 更像是 C++ vector.resize() 函数,它可用于为 C++“数组”初始化或重新分配存储。
    【解决方案2】:

    在这里,试试这个:

    @: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 有点小技巧,其他人可能知道更好的方法,但希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

          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。

      【讨论】:

        猜你喜欢
        • 2022-12-03
        • 2021-11-10
        • 2018-10-21
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多