Метод псевдонима с аргументом

У меня есть метод

def press_button(*key_buttons)
  # some interaction to send button 
end

и я использую это с аргументом: :shift, :tab, :backspace и т.д. Я хочу псевдонимы для этого метода с фиксированным аргументом, чтобы press_shift будет стоять за press_button(:shift), Можно ли сделать это? Или я должен обернуть этот метод, как:

def press_shift
  press_button(:shift)
end
def press_tab
  press_button(:tab)
end
def press_backspace
  press_button(:backspace)
end

2 ответа

Решение

Я думаю, что нашел решение для своего собственного вопроса. method_missing Рубиновый крючок поможет мне.

def method_missing(method_name, *args)
  if method_name.intern.include?('press')
    argument = /_(\w*)$/.match(method_name.intern)[0]
    press_button(argument.intern)
  else
    super
  end
end

Я не совсем уверен, что понимаю ваш вопрос, но я считаю, что это делает то, что вы просите:

[:shift, :tab, :backspace].each do |k|
  define_method("press_#{k}") { press_button(k) }
end

Теперь методы press_shift, press_tab, а также press_backspace определены.

Другие вопросы по тегам