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