Поддерживает ли Coldfusion динамические аргументы? - PullRequest
6 голосов
/ 14 ноября 2011

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

10 голосов
/ 14 ноября 2011

Да, CFML поддерживает динамические аргументы до тех пор, пока он поддерживает пользовательские функции.

Все аргументы, будь то явно определенные или переданные без определения, существуют в области аргументов.

Область действия 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 .

2 голосов
/ 14 ноября 2011

Да, аргументы передаются в функции в виде массива, называемого «аргументами». Кроме того, вы можете передать массив с именем argumentsCollection в функцию.

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");
0 голосов
/ 14 ноября 2011

В зависимости от того, как вызывается функция, аргументы могут содержаться в структуре с числовыми ключами, относящимися к их положению (индекс на основе 1), или в структуре с именем аргумента в качестве ключа.

если вы вызываете функцию, подобную этой;

func(1, "foo");

тогда аргументы будут доступны как аргументы [1] и аргументы [2]

если функция вызывается с передачей именованных аргументов или, например, с помощью argumentsCollection;

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

тогда аргументы доступны как аргументы ["foo"] и аргументы ["bar"]

...