在 ColdFusion 中调用函数时如何仅指定一些可选参数?
Posted
技术标签:
【中文标题】在 ColdFusion 中调用函数时如何仅指定一些可选参数?【英文标题】:How to specify only some optional arguments when calling function in ColdFusion? 【发布时间】:2010-11-07 11:15:27 【问题描述】:我有一个 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)>
【讨论】:
我通常喜欢这样做。我很可能会确定在运行时要包含哪些参数。将如果你使用命名参数,你也必须命名第一个
<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】:我也在寻找 Kip 发布的一些答案。以下是我实施的。希望它可以添加到我们可能的解决方案链中。我刚刚在cffunction代码中添加了<cfparam>
:
<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>
【讨论】:
我认为这不会起作用,因为<cfparam>
旨在“测试参数(即变量)是否存在,验证其数据,如果默认值为未分配,可选择提供一个。”在这种情况下,您可以根据需要对它们进行标记,因此在命中 cfparams 时,可以保证 args 1-3 存在。 (如果他们不这样做,函数调用会引发错误。)您可以在参数中提供默认值并使其不是必需的,但我猜在这种情况下,这就是您要避免的。跨度>
以上是关于在 ColdFusion 中调用函数时如何仅指定一些可选参数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我在 cfoutput 中调用函数时,ColdFusion 会添加空格?
当我们在ColdFusion中使用API 调用(POST请求)将参数数量传递给服务器时,如何修复“POST请求超出”错误?
Coldfusion的createObject()函数如何搜索组件?
如何使用JQuery和ColdFusion处理会话超时警告?