2009-07-01 18 views
14

que tienen una función de ColdFusion "foo", que toma tres argumentos, y los dos segundos son opcionales:¿Cómo especificar solo algunos argumentos opcionales cuando se llama a la función en ColdFusion?

<cffunction name="foo" access="public" returntype="any"> 
    <cfargument name="arg1" type="any" required="true" /> 
    <cfargument name="arg2" type="any" required="false" default="arg2" /> 
    <cfargument name="arg3" type="any" required="false" default="arg3" /> 

    ... 

    <cfreturn whatever /> 
</cffunction> 

Quiero llamar a foo, pasando arg1 y arg3, pero dejando fuera arg2. Sé que esto es posible si llamo a la función usando cfinvoke, pero esa sintaxis es muy detallada y complicada. He intentado estos dos enfoques, ninguno funciona:

<cfset somevar=foo(1, arg3=3) /> <!--- gives syntax error ---> 
<cfset somevar=foo(1, arg3:3) /> <!--- gives syntax error ---> 

Respuesta

29

Tiene que usar argumentos con nombre en todo momento. No puede mezclar argumentos nominales y posicionales como pueda en algunos otros idiomas.

<cfset somevar = foo(arg1=1, arg3=3) /> 
2

si utiliza argumentos con nombre que tiene que nombrar el primer demasiado

<cffunction name="foo" access="public" returntype="any"> 
    <cfargument name="arg1" type="any" required="true" /> 
    <cfargument name="arg2" type="any" required="false" default="arg2" /> 
    <cfargument name="arg3" type="any" required="false" default="arg3" /> 

    <cfreturn arg2 & " " & arg3> 
</cffunction> 


<cfset b = foo(arg1:1,arg3:2)> 
<cfoutput>#b#</cfoutput> 
20

O .. puede utilizar ArgumentCollection

En CF9 o por encima ...

<cfset somevar = foo(argumentCollection={arg1=1, arg3=3})> 

En CF8 o superior ...

<cfset args = {arg1=1, arg3=3}> 
<cfset somevar = foo(argumentCollection=args)> 

Si CF7 o por debajo ...

+0

Así es como generalmente prefiero hacerlo. Es más que probable que determine qué argumentos incluir en el tiempo de ejecución. Es agradable y fácil ajustar dentro de un bloque . – ale

+1

Como Al lo implica, debe actualizar sus ejemplos para mostrar que una ventaja importante de ArgumentCollection es que le permite construir/manipular las estructuras de una manera flexible, antes de enviarlo a la función; sus ejemplos actuales son simplemente largos. forma de usar todos los argumentos nombrados. :) –

+1

También vale la pena señalar que puede mezclar y combinar argumentos con nombre y ArgumentCollection en una sola llamada de función. –

0

yo también estaba buscando algunas respuestas tal como fue anunciado Kip. Lo siguiente es lo que implementé. Espero que pueda agregarse a nuestra cadena de posibles soluciones. Acabo de agregar <cfparam> al código de función:

<cffunction name="fn1" access="public" returntype="numeric"> 
    <cfargument name="arg1" type="numeric" required="true"> 
    <cfargument name="arg2" type="numeric" required="true"> 
    <cfargument name="arg3" type="query" required="false"> 
    <cfparam name="arguments.arg1" default=0> 
    <cfparam name="arguments.arg2" default=0> 
    <cfparam name="arguments.arg3" default=0> 
    <cfreturn arguments.arg1 + arguments.arg2 + arguments.arg3> 
</cffunction> 

<cfoutput>#fn1(arg1=1,arg2=2)#</cfoutput> 
+0

No creo que funcione ya que '' está destinado a "Comprueba la existencia de un parámetro (es decir, una variable), valida sus datos y, si no se asigna un valor predeterminado, opcionalmente proporciona uno. " En este caso, debe etiquetarlos según sea necesario, de modo que para cuando se produzcan los cfparams, se garantiza que existen los argumentos 1-3. (Si no fuera así, la llamada de función arrojaría un error.) Usted puede proporcionar un defecto en el argumento y hacerlo no es necesario, pero supongo en este contexto que eso es lo que está tratando de evitar. – bean5

Cuestiones relacionadas