Как мне повторно передать несколько аргументов метода в Ruby 1.8.5?

Я использую ruby ​​1.8.5, и я хотел бы использовать вспомогательный метод, чтобы помочь отфильтровать предпочтения пользователя следующим образом:

def send_email(user, notification_method_name, *args)
  # determine if the user wants this email
  return if !user.send("wants_#{notification_method_name}?")

  # different email methods have different argument lengths
  Notification.send("deliver_#{notification_method_name}", user, *args)
end

Это работает в ruby ​​1.8.6, однако, когда я пытаюсь сделать это в 1.8.5 и пытаюсь отправить более одного аргумента, я получаю сообщение об ошибке:

неверное количество аргументов (2 для X)

где X - количество аргументов, которое требуется конкретному методу. Я бы предпочел не переписывать все мои методы уведомлений - может ли Ruby 1.8.5 справиться с этим?

1 ответ

Хорошим решением является переключение на именованные аргументы с помощью хэшей:

def  send_email(args)
  user = args[:user]
  notification_method_name = args[:notify_name]

  # determine if the user wants this email
  return if !user.send("wants_#{notification_method_name}?")

  # different email methods have different argument lengths
  Notification.send("deliver_#{notification_method_name}", args)
end

send_email(
  :user        => 'da user',
  :notify_name => 'some_notification_method',
  :another_arg => 'foo'
)
Другие вопросы по тегам