2013-03-18 28 views
9

Tôi muốn có phương thức chấp nhận băm và đối số từ khóa tùy chọn. Tôi cố gắng xác định một phương pháp như thế này:Làm cách nào để ngăn chặn đối số vị trí được mở rộng thành các đối số từ khóa?

def foo_of_thing_plus_amount(thing, amount: 10) 
    thing[:foo] + amount 
end 

Khi tôi gọi phương pháp này với các đối số từ khóa, nó hoạt động như tôi mong đợi:

my_thing = {foo: 1, bar: 2} 
foo_of_thing_plus_amount(my_thing, amount: 20) # => 21 

Khi tôi bỏ qua đối số từ khóa, tuy nhiên, băm được ăn:

foo_of_thing_plus_amount(my_thing) # => ArgumentError: unknown keywords: foo, bar 

Làm cách nào để ngăn điều này xảy ra? Có một thứ như là một anti-splat?

+0

Cảm ơn. Ít nhất tôi biết một cách giải quyết bây giờ: sử dụng tham số từ khóa mỗi lần. Khá khó chịu. –

Trả lời

4

Đây là lỗi đã được sửa trong Ruby 2.0.0-p247, xem this issue.

+0

Sự cố được liên kết đề cập đến việc quay lại. Điều đó có ý nghĩa gì đối với tôi, thực tế? Tôi có thể cập nhật phiên bản ruby ​​2.0.0-p247 của mình bằng cách nào đó không? Hay nó có nghĩa là bất kỳ bản phát hành nào họ phát hành 2.0.0-pX sau này sẽ có bản sửa lỗi? –

1

gì về

def foo_of_thing_plus_amount(thing, opt={amount: 10}) 
    thing[:foo] + opt[:amount] 
end 

my_thing = {foo: 1, bar: 2} # {:foo=>1, :bar=>2} 
foo_of_thing_plus_amount(my_thing, amount: 20) # 21 
foo_of_thing_plus_amount(my_thing) # 11 

?

+0

Điều này phù hợp với ví dụ giả định của OP. Nhưng nếu định nghĩa phương thức ban đầu bao gồm nhiều đối số từ khóa tùy chọn, dòng ví dụ của bạn (kết quả là 21) sẽ loại bỏ chúng trong đối số 'opt' đã nhận, bởi vì chỉ có phím' amount' mới được chuyển. Vì nó là, trường hợp sử dụng hiện tại của tôi LÀ ví dụ giả định, vì vậy điều này sẽ giúp ích. –

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