我有以下类覆盖:
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)
不会产生错误。知道为什么吗?
答案 0 :(得分:5)
您犯了错字: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
#...
答案 1 :(得分:0)
你写了
def in(destination_currency)
在Ruby中,这意味着您的in
方法只需要一个参数。传递更多参数会导致错误。
如果你想让它有一个可变数量的参数,可以用splat运算符做这样的事情:
def in(*args)