Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在CFScript中使用for in构造时的有趣行为_Arrays_Coldfusion - Fatal编程技术网

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,感谢您的澄清。现在这是有道理的。如果你愿意把它写进一个答案,那就太好了。