arrays - español - ¿Por qué mi matriz original está siendo alterada?
solidity español (2)
Según la documentación de Coldfusion ... "Las matrices se transfieren a las funciones definidas por el usuario por valor, de modo que la función obtiene una nueva copia de los datos de la matriz, y la matriz no cambia la matriz en la página de llamadas " .
Así que estoy trabajando en un pequeño proyecto de práctica. Empiezo por tomar una lista de números, convertirla en una matriz (que llamo cardArray), luego ordenar la matriz y, finalmente, pasar la matriz a un par de UDF que buscarán varios patrones en los números y manipular (si es necesario) ) el argumento (también conocido como el conjunto pasado).
Nunca hago referencia al conjunto original en las UDF, solo hago referencia al nombre del argumento. Aún así ... si copio la matriz original después de llamar a las funciones, mi matriz original ha sido alterada. puede alguien decirme por que?
Estoy bastante seguro de que puedo solucionar esto. Por lo tanto, arreglar este no es mi gran problema. Mi problema es que este comportamiento contradice completamente la forma en que "pensé" que esto funcionaría, ¡y eso me está volviendo loco!
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>
Resultados en:
Serie original ANTES de llamar a la función [6,6,7,8,10,8,9].
Matriz original DESPUÉS de llamar a la función [10,9,7,6,5]
La matriz está ordenada (lo que espero, y es correcto). Sin embargo, los 8 también faltan. No esperaba esto. Los 8s son eliminados por los métodos arrayDeleteAt (pairArray, i) y arrayDeleteAt (pairArray, i-1) en la primera función. PERO esto debería eliminar elementos solo del argumento array (pairArray), no del array original (o eso creía yo).
Como Lucee está etiquetado aquí, asumo que está ejecutando esto en Lucee y no en la implementación de Adobe. Lucee no cumple con las especificaciones de Adobe en este caso; las matrices se pasan por referencia como todos los demás objetos complejos.
Esto puede ser bastante confuso, se refiere a las estructuras también. Hacer un <cfset arrayCopy = originalArray>
y luego modificar el arrayCopy con alguna función no garantizará que el array original permanezca protegido. La solución es hacer una copia profunda como esta:
<cfset arrayCopy = Duplicate(originalArray)>