2011-11-14 73 views
6

在Python中有*args約定我想知道CF9是否支持類似的東西。Coldfusion是否支持動態參數?

這裏是蟒示例

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

回答

10

是,CFML已經支持動態參數,只要它支持用戶定義的函數訪問。

所有參數,無論是明確定義的,還是傳遞而未定義,都存在於Arguments範圍中。

參數作用域可被視爲數組和結構(鍵/值)。


這裏是最接近等同於你的例子,使用腳本語法:

function func() 
{ 
     for (a in arguments) 
       WriteOutput(arguments[a] & "is a quality argument"); 
} 

注意a在這個例子中是按鍵的名稱,而不是價值,因此,爲什麼arguments[a]使用。

被視爲代碼,上述腳本必須是內<cfscript> .. </cfscript>標記,或者可替換地.cfc文件內的component { .. }塊內。


這裏有一對夫婦的標籤版本,第一個相當於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

我有問題讓你的最後一個例子工作......我得到的錯誤是函數聲明中缺少函數關鍵字。「......任何建議? – John

+0

第一個例子需要在塊 –

+2

'loop index =」a「 array = Arguments'?我從來沒有見過這個,這是用於Railo還是什麼? – Henry

2

是的,參數被傳遞到用作所謂的「參數」的陣列。另外,你可以將一個名爲「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"); 
+0

我以爲CF從索引1開始?在這種情況下它有什麼不同? **編輯**不要忘記第一個=)。 – John

+0

您是對的,最近一直在編寫太多的JavaScript :-) – bittersweetryan

+0

您也可以將argumentCollection作爲命名參數的結構傳遞。 'myFunc(argumentCollection = {foo =「hello」,bar =「word」}' –

0

根據如何該函數被調用的參數可能包含在一個結構中,數字鍵與它們的位置相關(基於1的索引)或者以參數名稱作爲關鍵字的結構。

如果你調用這樣的函數;

func(1, "foo"); 

那麼參數將作爲參數訪問[1]和參數[2]

如果函數調用傳遞命名的參數或使用argumentCollection,例如;

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

那麼參數是作爲參數[「foo」的]和參數[「酒吧」]