在Haxe中通过数组分配变量值?

时间:2015-07-30 05:49:51

标签: arrays variables haxe

如何将变量abcd值分配给1234通过数组?

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

2 个答案:

答案 0 :(得分:2)

这不起作用的原因是像Int这样的基本类型是不可变的。实际上,变量abcd甚至可能都不存在,因为它们永远不会改变。如果查看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);

这是对分析师的优化。

您需要某种容器类型来完成此操作,例如classtypedef。以下是使用后者的示例:

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时会评估bcdarray1

除了函数外,所有表达式的行为都是相同的:

/*
    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