Пропуск дополнительных аргументов ключевого слова в Ruby

Я определил метод:

def method(one: 1, two: 2)
   [one, two]
end

и когда я называю это так:

method one: 'one', three: 'three'

Я получил:

ArgumentError: unknown keyword: three

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

def method(one: 1, two: 2, **other)
  [one, two, other]
end

person Nick Roz    schedule 19.06.2015    source источник
comment
Почему ты не можешь сделать это как method(one: 1, two: 2, **other)?   -  person sawa    schedule 19.06.2015
comment
Эти **other параметры кажутся дополнительными   -  person Nick Roz    schedule 19.06.2015
comment
Вы хотите обратиться к другим параметрам в теле метода? И в то же время вы не хотите ссылаться на это в профиле метода? Если это так, то то, что вы пытаетесь сделать, не имеет смысла. Как вы можете ссылаться на конкретный параметр, не получая его в определении метода?   -  person sawa    schedule 19.06.2015
comment
Одна из причин заключается в том, чтобы не беспокоиться о порядке параметров, но есть и другие требования сделать это так.   -  person Nick Roz    schedule 19.06.2015


Ответы (3)


Если вы не хотите писать other как в **other, вы можете его опустить.

def method(one: 1, two: 2, **)
  [one, two]
end
person sawa    schedule 19.06.2015
comment
Я только что попробовал, и он не работает под ruby ​​2.0.0, который используется в моем текущем проекте. Поэтому я все еще получаю ту же ошибку - person Nick Roz; 19.06.2015
comment
Это работает на Ruby 2.2. Я думаю, что это должно работать и на Ruby 2.0. Что именно представляет собой ваше окружение? Надеюсь, вы не будете говорить, что пробовали это только на IRB, на котором оно не работает вне зависимости от версии Ruby. - person sawa; 19.06.2015
comment
Я пока не готов ответить. Я проверю это, используя разные версии, а затем дам вам знать, спасибо. - person Nick Roz; 19.06.2015
comment
Это также не работает, если вы, несмотря на все указания, как и я, склонны объявлять методы без круглых скобок. - person John Dvorak; 18.04.2017
comment
Ницца! Нравится, я искал именно это. - person greenymaster69; 26.05.2020

Не уверен, что это работает в ruby ​​2.0, но вы можете попробовать использовать **_, чтобы игнорировать другие аргументы.

def method(one: 1, two: 2, **_)

С точки зрения использования памяти и всего остального, я считаю, что нет никакой разницы между этим и **other, но подчеркивание — это стандартный способ отключить аргумент в ruby.

person Eugene Petrov    schedule 19.06.2015
comment
Если бы я хотел игнорировать все, кроме :one и :two, я бы сделал это так. - person chad_; 19.06.2015

Обычный способ приблизиться к этому — использовать хэш параметров. Вы часто будете видеть это:

def method_name(opts={})
  one = opts[:one] || 1  # if caller doesn't send :one, provide a default
  two = opts[:two] || 2  # if caller doesn't send :two, provide a default

  # etc
end
person chad_    schedule 19.06.2015
comment
Да, я знаю об этом, но мне особенно интересно использовать аргументы с ключевыми словами, а не мешанину опций. - person Nick Roz; 19.06.2015
comment
Ах хорошо. Что ж, в таком случае, если вы хотите игнорировать остальные, я видел **_ в качестве предлагаемого имени для двойного знака в конце. - person chad_; 19.06.2015