2009-07-16 42 views
9

En ColdFusion, la función arrayAppend() toma una matriz y un elemento para anexar. Modifica la matriz que se pasó y devuelve verdadero si tiene éxito.¿Por qué arrayAppend devuelve true y listAppend devuelve la lista?

La función listAppend(), sin embargo, toma una lista y un elemento para anexar, y devuelve una nueva lista con el elemento adjunto. No modifica la lista que se pasó.

¿Por qué estas funciones funcionan de dos maneras diferentes? Siempre estoy recurriendo a la documentación para recordar el valor de retorno de cada uno.

Respuesta

10

Esto se debe a que no hay ningún tipo de datos de "Lista" en ColdFusion.

Una "Lista" es una cadena delimitada, tan simple como eso. Está delimitado por comas por defecto, pero puede elegir el delimitador. "ListAppend()" es una operación de concatenación de cadenas, y como tal, devuelve el resultado de su trabajo como lo haría "string1 & string2".

Lo único que "ListAppend()" hace por usted es: Se encarga del manejo del delimitador, evitando los delimitadores dobles innecesarios, algo que "string1 & string2" no puede hacer.

Una matriz es un tipo de datos real y (a diferencia de una cadena) puede modificarse in situ. Esto es lo que hace ArrayAppend().

0

ListAppend es esencialmente una función de manipulación de cadenas que agrega el elemento al final de la lista y luego devuelve la nueva lista. Para realizar manipulaciones de cadenas que cambian el tamaño de una cadena, no puede simplemente agregar esos datos en la memoria. ¿Qué sucede si la siguiente ubicación en la memoria contiene otros datos importantes? En cambio, el sistema tiene que asignar un bloque de datos igual (o mayor) al tamaño de la nueva cadena. Este bloque está en una nueva ubicación, por lo que la referencia debe ser devuelta para que la persona que llama tenga acceso a los datos nuevos.

Con arrayAppend, el tamaño de la matriz es constante y no cambia, por lo que no es necesario crear una nueva referencia.

+1

no es del todo correcto. El tamaño de la matriz no siempre es constante en CF porque usa ArrayList, que cambiará el tamaño dinámicamente. Pero sé lo que quieres decir ... :) – Henry

+1

en realidad, la matriz en ColdFusion usa java.util.Vector, pero tienes razón, la capacidad se duplicará dinámicamente a medida que agregues nuevos elementos. – Jayson

+0

oh genial, gracias Jayson. – Henry

4

Para entender por qué sucede esto, necesita saber un poco sobre cómo funciona Strings en Java porque la implementación subyacente de una lista en ColdFusion es java.lang.String.

<cfset list = "a,b,c"/> 
<cfoutput>#list.getClass()#</cfoutput> 

En Java, las cadenas son inmutables y no tienen ningún método para modificar el contenido de una cadena. Si lo hizo el siguiente en Java, que sería la creación de una nueva instancia de un texto y asignarlo a s para cada declaración:

String s = "abc"; 
s = "def"; 
s = s.concat("ghi"); 

Utilizando el método listAppend() en ColdFusion es la creación de una nueva instancia de un texto bajo el capó y devolverlo, por lo tanto, la necesidad de hacer algo como esto cada vez que agregue valores a una lista.

<cfset list = "a,b,c"/> 
<cfset list = listAppend(list,'d')/> 
<cfoutput>#list#</cfoutput> 

Sin embargo, cuando se modifica una matriz con arrayAppend(), que está modificando directamente la matriz, por lo tanto no hay necesidad de volver a asignar el valor a sí mismo de nuevo como que necesita con listAppend().

+3

Si miras un poco hacia atrás, verás que Java no tiene nada que ver con el comportamiento de ListAppend(). ListAppend() se comporta así desde el principio, mientras que Java es parte del juego solo desde CF6. – Tomalak

1

También tenga en cuenta que, aunque todas las funciones incorporadas de la matriz modifican la matriz in situ, para usuario -funciones definidas, ¡las matrices se pasan por valor! Esto significa que no puede escribir una UDF que modifique una matriz in situ.(A menos que envuelva la matriz en un objeto que se pasado por referencia, tales como una estructura o un CFC.)

El resultado de esto es que si usted escribe sus propias funciones de utilidad matriz, con frecuencia tiene que terminar llamándolos así:

<cfset MyArray = DoSomethingWithArray(MyArray)> 
Cuestiones relacionadas