2011-11-14 15 views
6

En python existe la convención *args Me pregunto si CF9 admite algo similar.¿Coldfusion admite argumentos dinámicos?

Aquí está el ejemplo pitón

>>> def func(*args): 
     for a in args: 
       print a, "is a quality argument" 


>>> func(1, 2, 3) 
1 is a quality argument 
2 is a quality argument 
3 is a quality argument 
>>> 

Respuesta

10

Sí, CFML ha apoyado argumentos dinámicos durante el tiempo que se ha apoyado funciones definidas por el usuario.

Todos los argumentos, ya sean explícitamente definidos o pasados ​​sin definición, existen en el alcance de Argumentos.

El alcance de Arguments se puede tratar como una matriz y una estructura (clave/valor).


Aquí es el equivalente más cercano a su ejemplo, usando la sintaxis de script:

function func() 
{ 
     for (a in arguments) 
       WriteOutput(arguments[a] & "is a quality argument"); 
} 

Tenga en cuenta que a en este ejemplo es el nombre de la clave, no el valor, tanto por qué se utiliza arguments[a].

a ser tratado como código, el script de arriba debe tener lugar dentro de <cfscript> .. </cfscript> etiquetas, o, alternativamente, dentro de un bloque .. }component { dentro de un archivo .cfc.


Aquí hay un par de versiones de etiquetas, la primera equivalente a la de/en bucle:

<cffunction name="func"> 
    <cfloop item="a" collection=#Arguments#> 
     <cfoutput>#Arguments[a]# is a quality argument</cfoutput> 
    </cfloop> 
</cffunction> 


Y éste le permite acceder directamente el valor (es decir,a es el valor aquí):

<cffunction name="func"> 
    <cfloop index="a" array=#Arguments#> 
     <cfoutput>#a# is a quality argument</cfoutput> 
    </cfloop> 
</cffunction> 


En Railo * CFML, este último ejemplo se puede expresar en la escritura como:

function func() 
{ 
    loop index="a" array=Arguments 
    { 
     WriteOutput(a & 'is a quality argument'); 
    } 
} 

* Railo es una de dos alternativas de código abierto para Adobe ColdFusion, el otro es Open BlueDragon.

+2

Estoy teniendo problemas haciendo que funcione su último ejemplo ... el error que estoy obteniendo es 'function palabra clave falta en la declaración FUNCTION' ... ¿Alguna sugerencia? – John

+0

Ese primer ejemplo debería estar dentro del bloque

+2

' loop index = "a" array = Argumentos '? Nunca he visto esto, ¿es esto para Railo o algo? – Henry

2

Sí, los argumentos son pasados ​​a las funciones como una matriz llamada "argumentos". Además, puede pasar una matriz llamada "argumentCollection" en una función.

public void function myFunct(){ 
    var myVar = ""; 

    if(arrayLen(arguments)){ 
     myVar = arguments[1]; 
    } 
} 

funciones Invocación con argumentos dinámicos:

myFunc("hello","world"); 
    OR 
myFunc(argumentCollection=["Hello","World"]); 

Además se puede extender argumentos de esta manera han llamado argumentos y argumentos que están fuera de los argumentos con nombre:

public void function myFunction(String arg1){ 
    var secondArgument = ""; 

    if(arraylen(arguments) > 1){ 
    secondArgument = arguments[2]; 
    } 
} 

myFunction("Hello","World"); 
+0

Pensé que CF comenzaba en el índice 1? ¿Es diferente en este caso? ** Editar ** no olvides el primero también =). – John

+0

Estás en lo cierto, escribes demasiado JavaScript últimamente :-) – bittersweetryan

+0

También puedes pasar el argumentCollection como una estructura de argumentos con nombre. 'myFunc (argumentCollection = {foo =" hello ", bar =" word "}' –

0

Dependiendo de cómo la función se llama los argumentos pueden estar contenidos en una estructura con claves numéricas relacionadas con su posición (1 índice basado) o en una estructura con el nombre del argumento como la clave .

si llama a una función como esta;

func(1, "foo"); 

continuación, los argumentos serán accesibles como argumentos [1] y los argumentos [2]

si la función se llama que pasa en argumentos con nombre o el uso de argumentCollection, por ejemplo;

func(foo=1, bar="foo"); 

continuación, los argumentos son accesibles como argumentos [ "foo"] y argumentos [ "bar"]