У меня есть функция 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 · рейтинг 31 · Patrick McElhaney
Вы должны использовать именованные аргументы повсюду. Вы не можете смешивать именованные и позиционные аргументы, как в некоторых других языках.
<cfset somevar = foo(arg1=1, arg3=3) />
Ответ 2 · рейтинг 20 · Henry
Или... вы можете использовать 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 · рейтинг 2 · Nick Van Brunt
если вы используете именованные аргументы, вы также должны назвать первый
<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 · Ananthakrishnan
Я тоже искал ответы, как написал Кип. Вот что я реализовал. Надеюсь, это может добавить к нашей цепочке возможных решений. Я просто добавил <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>