CFSCRIPT - For 循环递增索引错误
CFSCRIPT - For loop increments the index wrong
我可能在 ColdFusion 2016 中发现了一个错误。
我有两个功能。第一个有一个循环,它从 1 迭代到 n 并将第二个函数的 return 值(也是一个数组)推入一个数组。我注意到了;
索引值为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>
cfc
中变量的默认作用域不仅仅是函数。而是它是 cfc 范围的。这通常是有问题的。
同样,cfc
之外的变量的默认范围是请求范围。这通常很有用。
两种方法
有两种方法可以限制 cfc
中变量的范围。一种是使用关键字var
,另一种是使用local.
说来话长。下面的示例解决方案始终使用 var。如果您想了解更多关于 var
与 local.
的信息,请单击此处:Scoping: 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>
我可能在 ColdFusion 2016 中发现了一个错误。 我有两个功能。第一个有一个循环,它从 1 迭代到 n 并将第二个函数的 return 值(也是一个数组)推入一个数组。我注意到了; 索引值为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>
cfc
中变量的默认作用域不仅仅是函数。而是它是 cfc 范围的。这通常是有问题的。
同样,cfc
之外的变量的默认范围是请求范围。这通常很有用。
两种方法
有两种方法可以限制 cfc
中变量的范围。一种是使用关键字var
,另一种是使用local.
说来话长。下面的示例解决方案始终使用 var。如果您想了解更多关于 var
与 local.
的信息,请单击此处:Scoping: 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>