2009-07-01 27 views
14

Tôi có một chức năng ColdFusion "foo" mà mất ba args, và lần thứ hai hai là không bắt buộc:Làm thế nào để chỉ định một số đối số tùy chọn khi gọi hàm trong ColdFusion?

<cffunction name="foo" access="public" returntype="any"> 
    <cfargument name="arg1" type="any" required="true" /> 
    <cfargument name="arg2" type="any" required="false" default="arg2" /> 
    <cfargument name="arg3" type="any" required="false" default="arg3" /> 

    ... 

    <cfreturn whatever /> 
</cffunction> 

Tôi muốn gọi foo, đi qua trong arg1 và arg3, nhưng rời ra arg2. Tôi biết rằng điều này là có thể nếu tôi gọi hàm bằng cách sử dụng cfinvoke, nhưng cú pháp đó thực sự tiết và phức tạp. Tôi đã thử hai cách tiếp cận này, không hoạt động:

<cfset somevar=foo(1, arg3=3) /> <!--- gives syntax error ---> 
<cfset somevar=foo(1, arg3:3) /> <!--- gives syntax error ---> 

Trả lời

29

Bạn phải sử dụng đối số được đặt tên trong suốt. Bạn không thể trộn các đối số được đặt tên và vị trí như bạn có thể bằng một số ngôn ngữ khác.

<cfset somevar = foo(arg1=1, arg3=3) /> 
2

nếu bạn sử dụng tên args bạn phải đặt tên là người đầu tiên quá

<cffunction name="foo" access="public" returntype="any"> 
    <cfargument name="arg1" type="any" required="true" /> 
    <cfargument name="arg2" type="any" required="false" default="arg2" /> 
    <cfargument name="arg3" type="any" required="false" default="arg3" /> 

    <cfreturn arg2 & " " & arg3> 
</cffunction> 


<cfset b = foo(arg1:1,arg3:2)> 
<cfoutput>#b#</cfoutput> 
20

Hoặc .. bạn có thể sử dụng ArgumentCollection

Trong CF9 trở lên ...

<cfset somevar = foo(argumentCollection={arg1=1, arg3=3})> 

Trong CF8 trở lên ...

<cfset args = {arg1=1, arg3=3}> 
<cfset somevar = foo(argumentCollection=args)> 

Nếu CF7 hoặc dưới ...

+0

Đây là cách tôi thường thích làm điều đó. Tôi có nhiều khả năng xác định các đối số để bao gồm trong thời gian chạy. Thật tuyệt vời và dễ dàng để bọc bên trong khối . – ale

+1

Như Al ngụ ý, bạn nên cập nhật các ví dụ của bạn để cho thấy rằng lợi ích chính của ArgumentCollection là nó cho phép bạn xây dựng/thao tác các cấu trúc theo kiểu linh hoạt, trước khi gửi nó đến hàm - ví dụ hiện tại của bạn chỉ là một cuộn dài cách sử dụng tất cả các đối số được đặt tên. :) –

+1

Cũng đáng lưu ý là bạn có thể kết hợp các đối số được đặt tên và kết hợp và ArgumentCollection trong một cuộc gọi hàm duy nhất. –

0

tôi cũng đang tìm kiếm một số câu trả lời là Kip đăng. Sau đây là những gì tôi đã thực hiện. Hy vọng nó có thể thêm vào chuỗi các giải pháp khả thi của chúng tôi. Tôi vừa thêm <cfparam> vào mã cffunction:

<cffunction name="fn1" access="public" returntype="numeric"> 
    <cfargument name="arg1" type="numeric" required="true"> 
    <cfargument name="arg2" type="numeric" required="true"> 
    <cfargument name="arg3" type="query" required="false"> 
    <cfparam name="arguments.arg1" default=0> 
    <cfparam name="arguments.arg2" default=0> 
    <cfparam name="arguments.arg3" default=0> 
    <cfreturn arguments.arg1 + arguments.arg2 + arguments.arg3> 
</cffunction> 

<cfoutput>#fn1(arg1=1,arg2=2)#</cfoutput> 
+0

Tôi không nghĩ rằng nó sẽ làm việc vì '' có nghĩa là "Kiểm tra sự tồn tại của một tham số (có nghĩa là, một biến), xác nhận dữ liệu của nó, và, nếu một giá trị mặc định không được gán, tùy chọn cung cấp một. " Trong trường hợp này, bạn gắn nhãn chúng theo yêu cầu, vì vậy vào thời điểm cfparams bị đánh, bạn được đảm bảo rằng args 1-3 tồn tại. (Nếu không, cuộc gọi chức năng sẽ gây ra lỗi.) Bạn có thể cung cấp mặc định trong đối số và không cần thiết, nhưng tôi đoán trong ngữ cảnh này là những gì bạn đang cố tránh. – bean5

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