Arrays 在CFScript中使用for in构造时的有趣行为
在使用Arrays 在CFScript中使用for in构造时的有趣行为,arrays,coldfusion,Arrays,Coldfusion,在使用for in时,我注意到了一些有趣的事情:似乎for(in)循环中的变量in struct参数被设置为自变量,并且没有引用其父数组键 如果运行以下代码,您将看到数组在输出时没有更改。循环中的变量local.i被赋予新值,但数组保持不变 function arrayTest() { local.foo = ["bar-one","bar-two", "bar-three"]; for (local.i in local.foo) { local.i
for in
时,我注意到了一些有趣的事情:似乎for(in)
循环中的变量in struct
参数被设置为自变量,并且没有引用其父数组键
如果运行以下代码,您将看到数组在输出时没有更改。循环中的变量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中是通过引用传递的,但我这里没有传递数组。我只是在中为in
构造使用一个。有区别,不是吗
在结构中调用参数
变量有点误导。
我把local.I
看作是local.foo[local.I]
的快捷方式。听起来var确实是数组键,我们可以修改它。这里的解决方案是使用一个普通的for()
循环。除非I
是某种类型的复杂对象或通过引用传递的对象,否则我不希望底层数组发生更改。例如,如果foo是
local.foo = [{a="b"},{a="c"}];
然后修改local.i.a=“我是键#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);
//示例
local.foo=[“bar one”];
for(local.foo中的local.i)
{
WriteOutput(“local.i(before)=#local.i.hashCode()#
”;/-335192660
WriteOutput(“local.foo[1]=#local.foo[1].hashCode()#
”;//-335192660
local.i=“我是key#local.i#”;
WriteOutput(“local.i(after)=#local.i.hashCode()#
”;/1075915694
}
writeDump(local.foo);
您正在访问数组的一个元素,而不是数组对象本身。在您的例子中,是一个简单的字符串。除非I
是某种类型的复杂对象或通过引用传递的对象,否则我不会期望底层数组发生更改。@Leigh,谢谢。好吧,我想我把local.I
看作是local.myArray[key]
的快捷方式,但事实并非如此。严格来说,这不是事实。如果local.i
是复杂的/通过引用传递的(如结构),那么修改它将修改底层数组中的对象。例如,使用local.foo=[{a=“b”},{a=“c”}]代码>修改local.i.a=“我是key#local.i.a”
将更改转储的结果。@Leigh,感谢您的澄清。现在这是有道理的。如果你愿意把它写进一个答案,那就太好了。