在CFScript中使用for-in构造时的有趣行为

时间:2011-07-27 15:47:10

标签: arrays coldfusion

我在使用for-in constructs in cfscript时发现了一些有趣的事情:variable in struct循环中的for(in)参数似乎被设置为一个自变量,并且没有引用它的父数组键。

如果运行以下代码,您将看到数组在输出时不会更改。循环中的变量local.i被赋予新值,但数组保持不变。

function arrayTest()
{
    local.foo = ["bar-one","bar-two", "bar-three"];

    for (local.i in local.foo)
    {
        local.i = "I am #local.i#";
        // Dump local.i; its output will be 'I am bar-[one[two]] etc...'
    }
    // Dump local.i; its output will as above

    // Dump the array; its keys remain unchanged: "bar-one, bar-two, -bar-three"
    writeDump(local.foo);
}

那为什么呢?我知道数组在CF中通过引用传递,但我不是在这里传递一个数组。我只是在for-in构造中使用一个。有区别,没有?

调用参数variable in structure.有点误导我将local.i视为local.foo[ local.i ]的快捷方式。听起来var确实是数组键,我们可以修改它。这里的解决方案是使用普通的for()循环。

1 个答案:

答案 0 :(得分:2)

我不希望底层数组发生变化,除非i是某种复杂对象或通过引用传递的东西。例如,如果foo是

 local.foo = [{a="b"},{a="c"}]; 

然后修改local.i.a = "I am key #local.i.a#";将修改数组中的对象,这些更改将反映在转储中。

<强>更新
最终,这归结为指针或参考。在松散的术语中,local.i只是指向数组中对象的指针。因此,重置local.i只是将变量指向变量到内存中的其他对象。它对阵列没有影响。注意hashcode值的变化?

// example
local.foo = [ "bar-one" ];
for (local.i in local.foo)
{
    WriteOutput("local.i (before) =#local.i.hashCode()#<br>"); //-335192660
    WriteOutput("local.foo[1] = #local.foo[1].hashCode()#<br>");//-335192660
    local.i = "I am key #local.i#";
    WriteOutput("local.i (after) = #local.i.hashCode()#<br>"); //1075915694
}

writeDump(local.foo);