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_currenyは と同じではありませんdestination_currency。したがって、通貨が複数形の場合、単数形の記号 ( ) ではなく@@currencies.has_key?元の記号 ( ) を参照しているため、テストは失敗します。これにより、呼び出しを通じて2 つの引数 ( and ) を持つ呼び出しがトリガーされますが、1 つの引数を取るように宣言されています。そのため、完全に引用するのを怠ったエラー メッセージは、ではなく不平を言っています。destination_currencydestination_currenymethod_missingmethod_iddestination_currencysupermethod_missingmethod_missingin

タイプミスを修正してください:

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メソッドが引数を 1 つだけ取ることを意味します。それ以上の引数を渡すと、エラーが発生します。

可変数の引数を持たせたい場合は、splat 演算子を使用して次のようにします。

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