Как указать только некоторые необязательные аргументы при вызове функции в ColdFusion?

У меня есть функция ColdFusion "foo", которая принимает три аргумента, а вторая вторая необязательна:

<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>

Я хочу вызвать foo, передавая в arg1 и arg3, но оставляя arg2. Я знаю, что это возможно, если я вызываю функцию с помощью cfinvoke, но этот синтаксис действительно многословен и сложный. Я пробовал эти два подхода, ни один из них не работает:

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

Ответы

Ответ 1

Вы должны использовать именованные аргументы повсюду. Вы не можете смешивать именованные и позиционные аргументы, как вы можете, на некоторых других языках.

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

Ответ 2

Или.. вы можете использовать ArgumentCollection

В CF9 или выше...

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

В CF8 или выше...

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

Если CF7 или ниже...

<cfset args = structNew()>
<cfset args.arg1 = 1>
<cfset args.arg3 = 3>
<cfset somevar = foo(argumentCollection=args)>

Ответ 3

если вы используете именованные args, вы также должны указать первый

<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>

Ответ 4

Я тоже искал ответы, как писал Кип. Вот что я сделал. Надеюсь, что это может добавить к нашей цепочке возможных решений. Я добавил код <cfparam> в код cffunction:

<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>