Интересное поведение при использовании for-in конструкций в CFScript - PullRequest
1 голос
/ 27 июля 2011

Я заметил кое-что интересное при использовании конструкций for-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 Ответ

2 голосов
/ 27 июля 2011

Я бы не ожидал, что базовый массив изменится, если i не будет сложным объектом какого-либо рода или чем-то, переданным по ссылке.Например, если foo

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

, то изменение local.i.a = "I am key #local.i.a#"; приведет к изменению объекта в массиве, и эти изменения будут отражены в вашем дампе.

Обновление:
В конечном итоге это сводится к указателям или ссылкам.В терминах Бесплатно , local.i - это просто указатель на объекты в массиве.Таким образом, сброс local.i просто указывает , что переменная на некоторый другой объект в памяти.Это не влияет на массив.Обратите внимание на изменение значения хэш-кода?

// 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...