我在使用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()
循环。
答案 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);