CFSCRIPT - Цикл for увеличивает индекс неправильно

Я мог бы найти ошибку в ColdFusion 2016. У меня есть две функции. Первая имеет цикл, который выполняет итерацию от 1 до n и помещает возвращаемое значение второй функции, которая также является массивом, в массив. Я заметил, что; значение индекса равно 1, вызывается функция и помещается значение в массив, а значение индекса является конечным значением цикла. Это ошибка?

<cfscript>
public array function fnc1(required array p1, required array p2, required numeric pSize, required numeric qSize, required numeric dSize){
iterationNum = pSize/2;
point = randRange(1, qSize-1);
for(i = 1; i <= iterationNum; i++){
    writeOutput(i); // prints: 1
    pop[i] = fnc2(p1[i], p2[i], point);
    writeOutput(i); // prints: iterationNum value
    writeDump(var = pop[i], label = "pop-"&i);
}
writeDump(var = pop, label="pop");
}

public array function fnc2(required array p1, required array p2, required numeric point){
n = arrayLen(p1);
concatArr = arrayNew(1);
for(i = 1; i <= point; i++){
    concatArr[i] = p1[i];
}
for(i = point + 1; i <= n; i++){
    concatArr[i] = p2[i];
}
writeDump(var=concatArr, label="Concated Array");
return concatArr;
}
</cfscript>

person sdiri    schedule 24.02.2018    source источник
comment
Я думаю, это твой код. В частности, вы не сохраняете свои переменные локальными для своих функций. Переменная i создается в fnc1 и перезаписывается в fnc2.   -  person Dan Bracuk    schedule 24.02.2018
comment
даже если я изменю имя моей переменной в первой функции и оставлю то же самое во второй функции, я получу ту же ошибку. Тем не менее, я не думаю, что это касается моего кода.   -  person sdiri    schedule 24.02.2018


Ответы (1)


Область видимости переменной внутри cfc по умолчанию — это не только функция. Но скорее это cfc широкий. Это часто проблематично.

Точно так же область действия по умолчанию переменной за пределами cfc широка для запроса. Это часто бывает полезно.

Два подхода

Есть два подхода к ограничению области видимости переменной внутри cfc. Один из них — использовать ключевое слово var, другой — использовать local..

Чем они отличаются, долго рассказывать. В приведенном ниже образце решения везде используется переменная var. Если вы хотите узнать больше о var и local., нажмите здесь: Область действия: Local vs Var

<cfscript>
public array function fnc1(required array p1, required array p2, required numeric pSize, required numeric qSize, required numeric dSize){
   var iterationNum = pSize/2;
   var point = randRange(1, qSize-1);
   for(var i = 1; i <= iterationNum; i++){
       writeOutput(i); // prints: 1
       pop[i] = fnc2(p1[i], p2[i], point);
       writeOutput(i); // prints: iterationNum value
       writeDump(var = pop[i], label = "pop-"&i);
   }
   writeDump(var = pop, label="pop");
}

public array function fnc2(required array p1, required array p2, required numeric point){
   var n = arrayLen(p1);
   var concatArr = arrayNew(1);
   for(var i = 1; i <= point; i++){
      concatArr[i] = p1[i];
      }
   for(var ii = point + 1; ii <= n; ii++){
      concatArr[ii] = p2[ii];
      }
   writeDump(var=concatArr, label="Concated Array");
   return concatArr;
   }
</cfscript>
person James A Mohler    schedule 24.02.2018
comment
Это часто проблематично. Ага. @sdiri - взгляните на ВСЕ переменные функций, а не только на индексы (pop[i] и т. д.). Кроме того, хорошей практикой является определение области действия всех ссылок на переменные, например использование arguments.p1 вместо p1. Делает код более читаемым. - person SOS; 27.02.2018