ColdFusion支持动态参数吗?

6 投票
3 回答
686 浏览
提问于 2025-04-17 06:18

在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 个回答

0

根据函数的调用方式,传入的参数可能会以不同的方式组织。如果是用数字作为键的结构体,键对应的是参数的位置(从1开始计数),或者用参数名作为键的结构体。

比如,如果你这样调用一个函数:

func(1, "foo");

那么你可以通过 arguments[1] 和 arguments[2] 来访问这些参数。

如果函数是通过命名参数或者使用 argumentCollection 来调用的,比如:

func(foo=1, bar="foo");

那么你就可以通过 arguments["foo"] 和 arguments["bar"] 来访问这些参数。

3

没错,函数接收的参数会被当作一个叫“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");
10

是的,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

撰写回答