为什么我原来的阵列被改变了?
Why is my original array being altered?
基于 Coldfusion 文档...“Arrays are passed to user-defined functions by value, so the function gets a new copy of the array data, and the array in the calling page is unchanged by the function.”
所以我正在做一个小练习项目。我首先获取一个数字列表,将其转换为一个数组(我称之为 cardArray),然后对数组进行排序,最后将数组传递给几个 UDF,这些 UDF 将在数字中寻找各种模式,并进行操作(如有必要) ) 参数(又名传递的数组)。
我从不在 UDF 中引用原始数组,我只引用参数名称。仍然...如果我在调用函数后 cfdump 原始数组,我的原始数组已被更改。谁能告诉我为什么?
我很确定我可以解决这个问题。因此解决这个问题不是我的大问题。我的问题是这种行为与我 "thought" 的工作方式完全矛盾,这让我发疯!
function hasPair(pairArray) {
pairCount = 0;
for (i=2; i lte arrayLen(pairArray); i++){
if(pairArray[i] is pairArray[i-1]){
pairCount++
arrayDeleteAt(pairArray, i)
arrayDeleteAt(pairArray, i-1)
i=2
}
}
return pairCount;
}
function hasStraight(straightArray){
sequenceCards = 0;
for (i=2; i lte arrayLen(straightArray); i++){
if(straightArray[i] - straightArray[i-1] is 1){
sequenceCards++
}
}
if (sequenceCards GTE 4){
return 1;
}
else{
return 0;
}
}
</cfscript>
<cfoutput>
<cfset cardList = "5,6,7,8,10,8,9">
<cfset cardArray = listToArray(cardList)>
<cfdump var="#cardArray#" label="Original Array Before">
<cfset arraySort(cardArray, "numeric", "desc")>
#hasPair(cardArray)# <br/>
#hasStraight(cardArray)# <br/>
<cfdump var="#cardArray#" label="Original Array After">
</cfoutput>
结果:
函数调用前的原始数组 [6,6,7,8,10,8,9]。
函数调用后的原始数组 [10,9,7,6,5]
数组已排序(如我所料,而且是正确的)。
但是,8s 也不见了。我没想到会这样。第一个函数中的 arrayDeleteAt(pairArray, i) 和 arrayDeleteAt(pairArray, i-1) 方法删除了 8。但是这应该只从数组参数(pairArray)中删除元素,而不是原始数组(或者我认为)。
由于您在此处标记了 Lucee,我假设您 运行 这是在 Lucee 而不是 Adobe 的实现上。在这种情况下,Lucee 不符合 Adobe 规范; arrays are passed by reference 与所有其他复杂对象一样。
这可能非常令人困惑,还涉及结构。执行 <cfset arrayCopy = originalArray>
然后用某些函数修改 arrayCopy 并不能保证原始数组仍然受到保护。解决方案是像这样进行深拷贝:
<cfset arrayCopy = Duplicate(originalArray)>
基于 Coldfusion 文档...“Arrays are passed to user-defined functions by value, so the function gets a new copy of the array data, and the array in the calling page is unchanged by the function.”
所以我正在做一个小练习项目。我首先获取一个数字列表,将其转换为一个数组(我称之为 cardArray),然后对数组进行排序,最后将数组传递给几个 UDF,这些 UDF 将在数字中寻找各种模式,并进行操作(如有必要) ) 参数(又名传递的数组)。
我从不在 UDF 中引用原始数组,我只引用参数名称。仍然...如果我在调用函数后 cfdump 原始数组,我的原始数组已被更改。谁能告诉我为什么?
我很确定我可以解决这个问题。因此解决这个问题不是我的大问题。我的问题是这种行为与我 "thought" 的工作方式完全矛盾,这让我发疯!
function hasPair(pairArray) {
pairCount = 0;
for (i=2; i lte arrayLen(pairArray); i++){
if(pairArray[i] is pairArray[i-1]){
pairCount++
arrayDeleteAt(pairArray, i)
arrayDeleteAt(pairArray, i-1)
i=2
}
}
return pairCount;
}
function hasStraight(straightArray){
sequenceCards = 0;
for (i=2; i lte arrayLen(straightArray); i++){
if(straightArray[i] - straightArray[i-1] is 1){
sequenceCards++
}
}
if (sequenceCards GTE 4){
return 1;
}
else{
return 0;
}
}
</cfscript>
<cfoutput>
<cfset cardList = "5,6,7,8,10,8,9">
<cfset cardArray = listToArray(cardList)>
<cfdump var="#cardArray#" label="Original Array Before">
<cfset arraySort(cardArray, "numeric", "desc")>
#hasPair(cardArray)# <br/>
#hasStraight(cardArray)# <br/>
<cfdump var="#cardArray#" label="Original Array After">
</cfoutput>
结果:
函数调用前的原始数组 [6,6,7,8,10,8,9]。
函数调用后的原始数组 [10,9,7,6,5]
数组已排序(如我所料,而且是正确的)。 但是,8s 也不见了。我没想到会这样。第一个函数中的 arrayDeleteAt(pairArray, i) 和 arrayDeleteAt(pairArray, i-1) 方法删除了 8。但是这应该只从数组参数(pairArray)中删除元素,而不是原始数组(或者我认为)。
由于您在此处标记了 Lucee,我假设您 运行 这是在 Lucee 而不是 Adobe 的实现上。在这种情况下,Lucee 不符合 Adobe 规范; arrays are passed by reference 与所有其他复杂对象一样。
这可能非常令人困惑,还涉及结构。执行 <cfset arrayCopy = originalArray>
然后用某些函数修改 arrayCopy 并不能保证原始数组仍然受到保护。解决方案是像这样进行深拷贝:
<cfset arrayCopy = Duplicate(originalArray)>