我想知道是否有办法将数组初始化为给定大小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的数组。
谢谢,
答案 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。