2009-07-01 9 views
14

Mam funkcji ColdFusion "foo", który trwa trzy argumenty, a drugi dwa są opcjonalne:Jak określić tylko niektóre opcjonalne argumenty podczas wywoływania funkcji w 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> 

chcę zadzwonić foo, przekazując arg1 i arg3, ale pomijając arg2. Wiem, że jest to możliwe, jeśli zadzwonię do tej funkcji, używając cfinvoke, ale ta składnia jest naprawdę gadatliwa i skomplikowana. Próbowałem tych dwóch podejść, ani działa:

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

Odpowiedz

29

Musisz używać nazwanych argumentów w całym tekście. Nie można mieszać argumentów nazwanych i pozycyjnych, jak w niektórych innych językach.

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

jeśli używasz nazwanych args trzeba wymienić pierwszą zbyt

<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

.. Albo można użyć ArgumentCollection

W CF9 lub powyżej ...

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

W CF8 lub nowszym ...

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

Jeśli CF7 lub poniżej ...

+0

Tak właśnie na ogół wolę to zrobić. Jestem bardziej niż prawdopodobne określenie, które argumenty należy uwzględnić w czasie wykonywania. Łatwo jest opakować wewnątrz bloku . – ale

+1

Zgodnie z tym, co sugeruje Al, powinieneś zaktualizować swoje przykłady, aby pokazać, że główną zaletą ArgumentCollection jest to, że pozwala budować/manipulować strukturami w elastyczny sposób, przed wysłaniem go do funkcji - twoje obecne przykłady są po prostu zszokowane sposób użycia wszystkich nazwanych argumentów. :) –

+1

Warto również zauważyć, że można mieszać i łączyć nazwane argumenty i ArgumentCollection w jednym wywołaniu funkcji. –

0

Ja też szukałem pewnych odpowiedzi jako Kip pisał. Oto co zaimplementowałem. Mam nadzieję, że może to dodać do naszego łańcucha możliwych rozwiązań. Właśnie dodałem <cfparam> do kodu funkcji:

<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

Nie sądzę, że będzie działać, ponieważ '' ma na celu "Testy na obecność parametru (to jest zmiennej), sprawdza poprawność jego danych, a jeśli wartość domyślna nie jest przypisana, opcjonalnie zapewnia jeden. " W tym przypadku etykietujesz je zgodnie z wymaganiami, więc do czasu trafienia cfparams masz zagwarantowane istnienie argumentów 1-3. (Jeśli nie, wywołanie funkcji spowoduje błąd.) Możesz podać wartość domyślną w argumencie i sprawić, że nie będzie to wymagane, ale zgaduję w tym kontekście, że tego właśnie próbujesz uniknąć. – bean5

Powiązane problemy