在ColdFusion中调用函数时如何只指定一些可选参数?

时间:2009-07-01 21:05:01

标签: syntax coldfusion optional-parameters

我有一个ColdFusion函数“foo”,它有三个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 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 --->

4 个答案:

答案 0 :(得分:30)

您必须始终使用命名参数。你不能像其他语言那样混合命名和位置参数。

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

答案 1 :(得分:20)

或..您可以使用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)>

答案 2 :(得分:2)

如果使用命名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>

答案 3 :(得分:0)

我也在寻找Kip发布的答案。以下是我实施的内容。希望它可以增加我们的可能解决方案链。我刚刚将<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>