1
class Numeric
  @@currencies = {'yen' => 0.013, 'euro' => 1.292, 'rupee' => 0.019, 'dollar' => 1.0}

  def method_missing(method, *args)
    singular_currency = (method == :in ? args.first : method).to_s.gsub(/s$/, '')
    if @@currencies.has_key?(singular_currency)
      self.send(method == :in ? :/ : :*, @@currencies[singular_currency])
    else
      super
    end
  end
end

コードを正確に取得できませんでした。変換用であることはわかっていますが、三項演算子の部分は取得していません。

4

1 に答える 1

4

これらの行:

singular_currency = (method == :in ? args.first : method).to_s.gsub(/s$/, '')
self.send(method == :in ? :/ : :*, @@currencies[singular_currency])

...次のように書くこともできます:

if method == :in
  singular_currency = args.first.to_s.gsub(/s$/, '')
  self / @@currencies[singular_currency]
else
  singular_currency = method.to_s.gsub(/s$/, '')
  self * @@currencies[singular_currency]
end

そのように書くことはより明確ですが、より多くの重複を追加します。Ruby(およびSmalltalkファミリー全体)では、メソッド呼び出しとメッセージ送信は同じものです。sendパラメータで指定されたメソッドを呼び出すメソッドです。

これをに追加するとmethod_missing、次のような構文をサポートできます。

4.dollars
# => 4 * 1.0
4.dollars.in(:yen)
# => 4 * 1.0 / 0.013

4.yen
# => 4 * 0.013
4.yen.in(:dollars)
# => 4 * 0.013 / 1.0
于 2012-10-11T21:46:25.087 に答える