Как я могу предотвратить расширение позиционного аргумента в аргументы ключевого слова?

Я хотел бы иметь метод, который принимает хэш и необязательный аргумент ключевого слова. Я попытался определить такой метод:

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

Когда я вызываю этот метод с аргументом ключевого слова, он работает так, как я ожидаю:

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

Однако, когда я опускаю аргумент ключевого слова, хеш съедается:

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

Как я могу предотвратить это? Есть ли такая вещь, как антисплат?


person ændrük    schedule 18.03.2013    source источник
comment
Спасибо. По крайней мере, теперь я знаю обходной путь: каждый раз использовать параметр ключевого слова. Довольно раздражает.   -  person Tyler Collier    schedule 11.02.2016


Ответы (2)


Эта ошибка была исправлена ​​в Ruby 2.0.0-p247, см. эту проблему.

person Marc-André Lafortune    schedule 18.03.2013
comment
В связанной проблеме упоминается бэкпорт. Что это значит для меня практически? Могу ли я как-то обновить версию ruby ​​2.0.0-p247? Или это означает, что любой выпуск 2.0.0-pX, который они выпустили после этого, будет иметь исправление? - person Tyler Collier; 11.02.2016

Что о

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

?

person David Unric    schedule 18.03.2013
comment
Это работает для гипотетического примера OP. Но если исходное определение метода включало несколько необязательных аргументов ключевого слова, строка вашего примера (которая приводит к 21) удалит их в полученном аргументе opt, потому что будет передан только ключ amount. Как бы то ни было, мой текущий вариант использования ЯВЛЯЕТСЯ гипотетическим примером, так что это помогает. - person Tyler Collier; 12.02.2016