Ruby - ArgumentError:参数个数错误(2个为1)

时间:2012-03-11 06:07:09

标签: ruby metaprogramming numeric method-missing

我有以下类覆盖:

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)不会产生错误。知道为什么吗?

2 个答案:

答案 0 :(得分:5)

您犯了错字:destination_currenydestination_currency不同。因此,当货币为复数时,您的@@currencies.has_key?测试会失败,因为它会查看原始符号(destination_currency)而不是单数化符号(destination_curreny)。这将通过method_missing调用触发带有两个参数(method_iddestination_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)