通过HAXE数组分配变量值?

问题描述 投票:4回答:2

如何通过一个数组变量赋值abcd1234

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
arrays variables haxe
2个回答
2
投票

这不工作的原因是基本类型,如Int是不可改变的。事实上,变量abcd还不如根本不存在,因为他们永远不会改变。如果你看一下在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);

这是分析的优化。

你需要某种形式的容器类型来实现这一点,像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
}

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

事实上,这种行为在大多数其他语言一样好。

原因是,数组声明采用输入表达式,而不是他们的参考值。这意味着abc,并设置darray1进行评估。

这种行为是对所有表达式一样,除了只对功能:

/*
    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
© www.soinside.com 2019 - 2024. All rights reserved.