2013-03-18 13 views
9

Chciałbym mieć metodę, która akceptuje hash i opcjonalny argument słowa kluczowego. Próbowałem definiowania metody takie jak to:Jak mogę zapobiec rozszerzeniu argumentu pozycyjnego na argumenty słów kluczowych?

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

Kiedy wywołać tę metodę z argumentem kluczowym, to działa jak oczekuję:

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

Kiedy pominąć argumentu słowa kluczowego jednak hash zostanie zjedzony:

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

Jak mogę temu zapobiec? Czy istnieje coś takiego jak antysplat?

+0

Dzięki. Przynajmniej teraz wiem obejście: użyj parametru keyword za każdym razem. Bardzo denerwujące. –

Odpowiedz

4

To jest błąd, który został naprawiony w Ruby 2.0.0-p247, patrz this issue.

+0

Powiązana kwestia wspomina o przenoszeniu. Co to właściwie oznacza dla mnie? Czy mogę jakoś zaktualizować swoją ruby ​​w wersji 2.0.0-p247? Czy może to oznaczać wydane przez nich wydanie 2.0.0-pX po tym, jak będzie to naprawić? –

1

Co

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

Działa to w hipotetycznym przykładzie OP. Ale jeśli oryginalna definicja metody zawierała wiele opcjonalnych argumentów słów kluczowych, linia przykładowa (która daje wynik 21) usunęłaby je z odebranego argumentu "opt", ponieważ tylko klucz "amount" zostałby przekazany. Obecnie moim przypadkiem użycia jest hipotetyczny przykład, więc to pomaga. –

Powiązane problemy