Ruby - ArgumentError: неверное количество аргументов (2 для 1)
У меня есть следующий класс перезаписать:
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
Всякий раз, когда аргумент для во множественном числе, например: 10.dollars.in(:yens)
я получил ArgumentError: wrong number of arguments (2 for 1)
но 10.dollars.in(:yen)
не дает ошибки. Есть идеи почему?
2 ответа
Вы сделали опечатку: 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)