Frage

Ich habe die folgende Klasse überschrieben:

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

Wann immer das Argument für in zum Beispiel Plural ist : 10.dollars.in(:yens) Ich bekomme ArgumentError: wrong number of arguments (2 for 1) aber 10.dollars.in(:yen) ergibt keinen Fehler.Irgendeine Idee warum?

War es hilfreich?

Lösung

Du hast einen Tippfehler gemacht: destination_curreny ist nicht dasselbe wie destination_currency.Also, wenn die Währung Plural ist, deine @@currencies.has_key? test schlägt fehl, weil es sich um das ursprüngliche Symbol handelt (destination_currency) anstelle des singularisierten Symbols (destination_curreny).Das wird eine auslösen method_missing aufruf mit zwei Argumenten (method_id und destination_currency) durch die super rufen Sie an, aber Sie haben Ihre deklariert method_missing um ein Argument zu nehmen.Deshalb beschwert sich die Fehlermeldung, über die Sie es versäumt haben, vollständig zu zitieren method_missing anstatt in.

Korrigieren Sie Ihren Tippfehler:

def in(destination_currency)
  destination_currency = destination_currency.to_s.gsub(/s$/, '').to_sym
  #...

Andere Tipps

Du hast geschrieben

def in(destination_currency)

In Ruby bedeutet dies, dass Ihre in methode benötigt genau ein Argument.Das Übergeben weiterer Argumente führt zu einem Fehler.

Wenn Sie eine variable Anzahl von Argumenten zulassen möchten, machen Sie so etwas mit dem Splat-Operator:

def in(*args)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top