18

我有一个 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 --->
4

4 回答 4

33

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

<cfset somevar = foo(arg1=1, arg3=3) />   
于 2009-07-01T21:12:02.043 回答
21

或者..你可以使用 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)>
于 2009-07-01T21:15:31.820 回答
2

如果你使用命名参数,你也必须命名第一个

<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>
于 2009-07-01T21:12:13.277 回答
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>
于 2011-07-28T01:28:17.807 回答