2009-07-01 11 views
14

Ho una funzione ColdFusion "foo", che prende tre argomenti, e le altre due sono opzionali:Come specificare solo alcuni argomenti facoltativi quando si chiama la funzione in 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> 

voglio chiamare foo, passando arg1 e arg3, ma lasciando fuori arg2. So che questo è possibile se chiamo la funzione usando cfinvoke, ma quella sintassi è davvero prolissa e complicata. Ho provato questi due approcci, né funziona:

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

risposta

29

È necessario utilizzare gli argomenti denominati in tutto. Non è possibile combinare argomenti nominali e posizionali come è possibile in alcune altre lingue.

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

se si utilizza args nome si deve nominare il primo troppo

<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 .. è possibile utilizzare ArgumentCollection

In CF9 o superiore ...

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

in CF8 o superiore ...

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

Se CF7 o al di sotto ...

+0

Questo è il modo in cui generalmente preferisco farlo. Sono più che probabile che determini quali argomenti includere a runtime. È bello e facile racchiudere all'interno di un blocco . – ale

+1

Come Al implica, dovresti aggiornare i tuoi esempi per dimostrare che uno dei principali vantaggi di ArgumentCollection è che ti permette di costruire/manipolare le strutture in modo flessibile, prima di inviarlo alla funzione - i tuoi esempi attuali sono solo prolissi modo di usare tutti gli argomenti con nome. :) –

+1

Da notare anche che è possibile combinare gli argomenti con nome e ArgumentCollection in una singola chiamata di funzione. –

0

anch'io era alla ricerca di alcune risposte, come postato Kip. Di seguito è ciò che ho implementato. Spero che possa aggiungere alla nostra catena di possibili soluzioni. Ho appena aggiunto <cfparam> al codice di cffing:

<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

Non penso che funzionerà poiché "" è inteso per "Test per l'esistenza di un parametro (ovvero una variabile), convalida i suoi dati e, se non viene assegnato un valore predefinito, ne fornisce facoltativamente uno. " In questo caso, li etichetti come richiesto, quindi quando vengono colpiti i cfparam, ti viene garantito che gli argomenti 1-3 esistono. (In caso contrario, la chiamata alla funzione genererebbe un errore.) È possibile fornire un valore predefinito nell'argomento e renderlo non necessario, ma in questo contesto indovino che è ciò che si sta tentando di evitare. – bean5

Problemi correlati