Руби — Ошибка аргумента:неправильное количество аргументов (2 на 1)

StackOverflow https://stackoverflow.com//questions/9652861

Вопрос

У меня есть следующая перезапись класса:

class Numeric
  @@currencies = {:dollar => 1, :yen => 0.013, :euro => 1.292, :rupee => 0.019}
  def method_missing(method_id)
    singular_currency = method_id.to_s.gsub( /s$/, '').to_sym
    if @@currencies.has_key?(singular_currency)
      self * @@currencies[singular_currency]
    else
      super
    end
  end

  def in(destination_currency)
    destination_curreny = destination_currency.to_s.gsub(/s$/, '').to_sym
    if @@currencies.has_key?(destination_currency)
      self / @@currencies[destination_currency]
    else
      super 
    end
  end
end

Всякий раз, когда аргумент в пользу in стоит во множественном числе, например: 10.dollars.in(:yens) я получил ArgumentError: wrong number of arguments (2 for 1) но 10.dollars.in(:yen) не дает никакой ошибки.Есть идеи, почему?

Это было полезно?

Решение

Вы допустили опечатку: destination_curreny это не то же самое, что destination_currency.Поэтому, когда валюта стоит во множественном числе, ваш @@currencies.has_key? тест не пройден, потому что он смотрит на исходный символ (destination_currency), а не сингулярный символ (destination_curreny).Это вызовет method_missing вызов с двумя аргументами (method_id и destination_currency) сквозь super позвони, но ты заявил о своем method_missing принять один аргумент.Вот почему сообщение об ошибке, которое вы не процитировали полностью, жалуется на method_missing скорее, чем in.

Исправьте опечатку:

def in(destination_currency)
  destination_currency = destination_currency.to_s.gsub(/s$/, '').to_sym
  #...

Другие советы

Вы написали

def in(destination_currency)

В Ruby это означает, что ваш in метод принимает ровно один аргумент.Передача большего количества аргументов приводит к ошибке.

Если вы хотите, чтобы у него было переменное количество аргументов, сделайте что-то вроде этого с оператором splat:

def in(*args)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top