在 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)>

【讨论】:

我通常喜欢这样做。我很可能会确定在运行时要包含哪些参数。将 包装在 块内既好又容易。 正如 Al 暗示的那样,您应该更新您的示例以表明 ArgumentCollection 的一个主要好处是它允许您在将其发送到函数之前以灵活的方式构建/操作结构 - 您当前示例只是使用所有命名参数的冗长方式。 :) 另外值得注意的是,您可以在单个函数调用中混合匹配命名参数和 ArgumentCollection。【参考方案3】:

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

<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代码中添加了&lt;cfparam&gt;

<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>

【讨论】:

我认为这不会起作用,因为&lt;cfparam&gt; 旨在“测试参数(即变量)是否存在,验证其数据,如果默认值为未分配,可选择提供一个。”在这种情况下,您可以根据需要对它们进行标记,因此在命中 cfparams 时,可以保证 args 1-3 存在。 (如果他们不这样做,函数调用会引发错误。)您可以在参数中提供默认值并使其不是必需的,但我猜在这种情况下,这就是您要避免的。跨度>

以上是关于在 ColdFusion 中调用函数时如何仅指定一些可选参数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我在 cfoutput 中调用函数时,ColdFusion 会添加空格?

当我们在ColdFusion中使用API 调用(POST请求)将参数数量传递给服务器时,如何修复“POST请求超出”错误?

Coldfusion的createObject()函数如何搜索组件?

如何使用JQuery和ColdFusion处理会话超时警告?

如何注册 ColdFusion 回调并从 Java 类调用它?

cfcomponent 中的 cfquery 未在 Coldfusion 9 中返回最新结果