如何通过一个数组变量赋值a
,b
,c
和d
值1
,2
,3
和4
?
var a:Int = 0, b:Int = 0, c:Int = 0, d:Int = 0;
var array1:Array<Int> = [a, b, c, d];
var array2:Array<Int> = [1, 2, 3, 4];
for (i in 0...4)
array1[i] = array2[i]; //this does not work, it assigns array1's elements instead
trace(a); // this prints 0 instead of 1
trace(b); // 0 instead of 2
trace(c); // 0 instead of 3
trace(d); // 0 instead of 4
这不工作的原因是基本类型,如Int
是不可改变的。事实上,变量a
,b
,c
和d
还不如根本不存在,因为他们永远不会改变。如果你看一下在try.haxe.org的JS源选项卡,你会注意到他们是不存在的输出:
var array1 = [0,0,0,0];
var array2 = [1,2,3,4];
var _g = 0;
while(_g < 4) {
var i = _g++;
array1[i] = array2[i];
}
console.log(0);
console.log(0);
console.log(0);
console.log(0);
这是分析的优化。
你需要某种形式的容器类型来实现这一点,像class
或typedef
。下面是使用后者的例子:
class Test {
static function main() {
var a:IntContainer = { value: 0 };
var b:IntContainer = { value: 0 };
var c:IntContainer = { value: 0 };
var d:IntContainer = { value: 0 };
var array1:Array<IntContainer> = [a, b, c, d];
var array2:Array<Int> = [1, 2, 3, 4];
for (i in 0...4)
array1[i].value = array2[i];
trace(a.value);
trace(b.value);
trace(c.value);
trace(d.value);
}
}
typedef IntContainer = {
value:Int
}
通过@ Gama11提供的解决方法是正确的,我们需要一个容器类型,但推理是错误的。问题不在于任何优化的效果。
如果我们运行JS等效代码有问题的,我们仍然会得到相同的结果:
var a = 0, b = 0, c = 0, d = 0;
var array1 = [a, b, c, d];
var array2 = [1, 2, 3, 4];
for (var i = 0; i < 4; i++)
array1[i] = array2[i];
console.log(a); // 0
console.log(b); // 0
console.log(c); // 0
console.log(d); // 0
事实上,这种行为在大多数其他语言一样好。
原因是,数组声明采用输入表达式,而不是他们的参考值。这意味着a
,b
,c
,并设置d
时array1
进行评估。
这种行为是对所有表达式一样,除了只对功能:
/*
variable
*/
var a = "A";
var b = a;
a = "B";
trace(b); // A
/*
anon. object
*/
var a = "A";
var c = { _c: a };
a = "C";
trace(c._c); // A
/*
Map
*/
var a = "A";
var d = ["_d" => a];
a = "D";
trace(d["_d"]); // A
/*
function
The function body is evaluated every time when it is called.
*/
var a = "A";
var f = function () return a;
a = "F";
trace(f()); // F <-- notice this