2011-11-14 28 views
6

Trong trăn có quy ước *args Tôi tự hỏi nếu CF9 hỗ trợ một cái gì đó tương tự.Coldfusion có hỗ trợ các đối số động không?

Dưới đây là ví dụ 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 
>>> 

Trả lời

10

Vâng, CFML đã hỗ trợ đối số động cho miễn là nó đã hỗ trợ chức năng người dùng định nghĩa.

Tất cả các đối số, cho dù được xác định rõ ràng hay đã được chuyển vào mà không được xác định, tồn tại trong phạm vi Đối số.

Phạm vi đối số có thể được coi là cả mảng và cấu trúc (khóa/giá trị).


Dưới đây là tương đương gần nhất với ví dụ của bạn, sử dụng cú pháp kịch bản:

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

Lưu ý rằng a trong ví dụ này là tên chính, không phải là giá trị, do vậy tại sao arguments[a] được sử dụng.

Để được coi là mã, kịch bản ở trên một trong hai phải nằm trong <cfscript> .. </cfscript> thẻ, hoặc cách khác bên trong một component { .. } khối bên trong một tập tin .cfc.


Dưới đây là một vài phiên bản thẻ, tương đương đầu tiên đến cho/trong vòng lặp:

<cffunction name="func"> 
    <cfloop item="a" collection=#Arguments#> 
     <cfoutput>#Arguments[a]# is a quality argument</cfoutput> 
    </cfloop> 
</cffunction> 


Và một điều này cho phép bạn truy cập vào giá trị trực tiếp (ví dụ:a là giá trị ở đây):

<cffunction name="func"> 
    <cfloop index="a" array=#Arguments#> 
     <cfoutput>#a# is a quality argument</cfoutput> 
    </cfloop> 
</cffunction> 


Trong Railo * CFML, ví dụ cuối cùng này có thể được diễn tả trong kịch bản như:

function func() 
{ 
    loop index="a" array=Arguments 
    { 
     WriteOutput(a & 'is a quality argument'); 
    } 
} 

* Railo là một trong hai lựa chọn thay thế mã nguồn mở để Adobe ColdFusion, cái còn lại là Open BlueDragon.

+2

Tôi gặp sự cố lấy ví dụ cuối cùng của bạn để làm việc ... lỗi tôi đang nhận là 'từ khóa chức năng bị thiếu trong khai báo FUNCTION.' ... Bất kỳ đề xuất nào? – John

+0

Ví dụ đầu tiên đó sẽ cần phải nằm trong vòng khối –

+2

' loop index = "a" Tôi đã không bao giờ nhìn thấy điều này, là điều này cho Railo hoặc một cái gì đó? – Henry

2

Vâng, đối số được truyền vào có chức năng như một mảng gọi là "lập luận". Ngoài ra, bạn có thể chuyển vào một mảng được gọi là "argumentCollection" vào một hàm.

public void function myFunct(){ 
    var myVar = ""; 

    if(arrayLen(arguments)){ 
     myVar = arguments[1]; 
    } 
} 

chức năng Gọi với đối số động:

myFunc("hello","world"); 
    OR 
myFunc(argumentCollection=["Hello","World"]); 

Ngoài ra bạn có thể mở rộng tranh luận theo cách này đã đặt tên các đối số và đối số nằm ngoài các đối số được đặt tên:

public void function myFunction(String arg1){ 
    var secondArgument = ""; 

    if(arraylen(arguments) > 1){ 
    secondArgument = arguments[2]; 
    } 
} 

myFunction("Hello","World"); 
+0

Tôi nghĩ CF bắt đầu ở chỉ mục 1? Nó có khác biệt trong trường hợp này không? ** Chỉnh sửa ** đừng quên cái đầu tiên =). – John

+0

Bạn đúng, đã viết quá nhiều JavaScript gần đây :-) – bittersweetryan

+0

Bạn cũng có thể chuyển đối sốCollection vào dưới dạng cấu trúc của các đối số được đặt tên. 'myFunc (argumentCollection = {foo =" hello ", bar =" word "}' –

0

Tùy thuộc vào cách chức năng được gọi là các đối số có thể được chứa trong một cấu trúc với các phím số liên quan đến vị trí của chúng (chỉ số dựa trên 1) hoặc trong một cấu trúc với tên đối số làm khóa .

nếu bạn gọi một hàm như thế này;

func(1, "foo"); 

sau đó các đối số sẽ có thể truy cập như các đối số [1] và lập luận [2]

nếu hàm được gọi đi trong đối số tên hoặc sử dụng argumentCollection, ví dụ;

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

sau đó các đối số có thể truy cập như các đối số [ "foo"] và lập luận [ "bar"]

Các vấn đề liên quan