2009-03-29 14 views
7

Tôi có một phương pháp như thế này:Trong một phương thức lấy nhiều tham số tùy chọn, làm cách nào có thể, nhưng chỉ số đầu tiên được chỉ định?

def foo(fruit='apple', cut="sliced", topping="ice cream") 
    # some logic here 
end 

Làm thế nào tôi có thể gọi nó là nơi mà tôi chỉ ghi đè lên các thông số đứng đầu nhưng sử dụng các giá trị mặc định cho những người khác, một cái gì đó như thế này

foo('','','hot fudge') 

Tất nhiên điều này không hoạt động như dự định, nhưng tôi chỉ muốn cung cấp giá trị cho tham số tùy chọn thứ ba và có hai giá trị đầu tiên với giá trị mặc định của chúng. Tôi biết làm thế nào để làm điều này với một băm, nhưng là một cách tắt của họ để làm điều đó, bằng cách sử dụng cú pháp trên?

Trả lời

17

Bạn không thể sử dụng cú pháp này để thực hiện điều này bằng ruby. Tôi muốn giới thiệu cú pháp băm cho việc này.

def foo(args={}) 
    args[:fruit] ||= 'apple' 
    args[:cut]  ||= 'sliced' 
    args[:topping] ||= 'ice cream' 
    # some logic here 
end 

foo(:topping => 'hot fudge') 

Bạn cũng có thể làm điều này bằng đối số vị trí:

def foo(fruit=nil,cut=nil,topping=nil) 
    fruit ||= 'apple' 
    cut  ||= 'sliced' 
    topping ||= 'ice cream' 
    # some logic here 
end 

foo(nil,nil,'hot fudge') 

Gấu nhớ rằng cả hai kỹ thuật ngăn cản bạn đi thực tế nil đối số cho chức năng (khi bạn có thể muốn đôi khi)

2

No. Bạn phải kiểm tra giá trị của các tham số bên trong hàm foo. Nếu chúng là chuỗi rỗng, hoặc null, bạn có thể đặt chúng thành tham số mặc định.

15

Kể từ Ruby 2.0, bạn có thể sử dụng đối số từ khóa:

def foo(fruit: 'apple', cut: "sliced", topping: "ice cream") 
    [fruit, cut, topping] 
end 

foo(topping: 'hot fudge') # => ['apple', 'sliced', 'hot fudge'] 
+0

Và như của Ruby 2.1 có hỗ trợ cho 'đối số từ khóa bắt buộc', xem [ghi chú phát hành] (https://github.com/ruby/ruby/blob/ruby_2_1/NEWS#L16-17) – Epigene

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