如何将变量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
答案 0 :(得分:2)
这不起作用的原因是像Int
这样的基本类型是不可变的。实际上,变量a
,b
,c
和d
甚至可能都不存在,因为它们永远不会改变。如果查看try.haxe.org上的JS Source选项卡,您会注意到它们不在输出中:
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
}
答案 1 :(得分:2)
@ 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
事实上,这种行为在大多数其他语言中也是如此。
原因是,Array声明采用输入表达式的值而不是引用。这意味着在设置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