0

我有以下类覆盖:

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

4

2 回答 2

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
  #...
于 2012-03-11T06:16:23.287 回答
0

你写了

def in(destination_currency)

在 Ruby 中,这意味着您的in方法只需要一个参数。传递更多参数会导致错误。

如果您想让它具有可变数量的参数,请使用 splat 运算符执行以下操作:

def in(*args)
于 2012-03-11T06:09:26.357 回答