ColdFusion支持动态参数吗?
在Python中,有一个叫做*args
的用法,我想知道CF9是否支持类似的功能。
下面是一个Python的例子
>>> def func(*args):
for a in args:
print a, "is a quality argument"
>>> func(1, 2, 3)
1 is a quality argument
2 is a quality argument
3 is a quality argument
>>>
3 个回答
根据函数的调用方式,传入的参数可能会以不同的方式组织。如果是用数字作为键的结构体,键对应的是参数的位置(从1开始计数),或者用参数名作为键的结构体。
比如,如果你这样调用一个函数:
func(1, "foo");
那么你可以通过 arguments[1] 和 arguments[2] 来访问这些参数。
如果函数是通过命名参数或者使用 argumentCollection 来调用的,比如:
func(foo=1, bar="foo");
那么你就可以通过 arguments["foo"] 和 arguments["bar"] 来访问这些参数。
没错,函数接收的参数会被当作一个叫“arguments”的数组传入。此外,你还可以把一个叫“argumentCollection”的数组传入函数。
public void function myFunct(){
var myVar = "";
if(arrayLen(arguments)){
myVar = arguments[1];
}
}
使用动态参数来调用函数:
myFunc("hello","world");
OR
myFunc(argumentCollection=["Hello","World"]);
另外,你还可以通过这种方式扩展参数,使得可以使用命名参数和那些不在命名参数中的参数:
public void function myFunction(String arg1){
var secondArgument = "";
if(arraylen(arguments) > 1){
secondArgument = arguments[2];
}
}
myFunction("Hello","World");
是的,CFML从一开始就支持动态参数,只要它支持用户自定义函数。
所有的参数,无论是明确定义的,还是没有定义就直接传入的,都会存在于一个叫做Arguments的范围内。
这个Arguments范围可以看作是一个数组,也可以看作是一个包含键值对的结构。
这里有一个最接近你例子的用法,使用的是脚本语法:
function func()
{
for (a in arguments)
WriteOutput(arguments[a] & "is a quality argument");
}
注意,在这个例子中,a
是键名,而不是值,所以使用了arguments[a]
。
要把上面的脚本当作代码执行,它必须放在<cfscript>
和</cfscript>
标签之间,或者放在一个component {
和}
块里,位于一个.cfc
文件中。
这里有几个标签版本,第一个是等同于for/in循环的:
<cffunction name="func">
<cfloop item="a" collection=#Arguments#>
<cfoutput>#Arguments[a]# is a quality argument</cfoutput>
</cfloop>
</cffunction>
这个版本允许你直接访问值(也就是说,这里的a
是值):
<cffunction name="func">
<cfloop index="a" array=#Arguments#>
<cfoutput>#a# is a quality argument</cfoutput>
</cfloop>
</cffunction>
在Railo* CFML中,最后这个例子可以用脚本表示为:
function func()
{
loop index="a" array=Arguments
{
WriteOutput(a & 'is a quality argument');
}
}
*Railo是Adobe ColdFusion的两个开源替代品之一,另一个是Open BlueDragon。