Ruby - ArgumentError:falsche Anzahl von Argumenten (2 für 1)
-
11-12-2019 - |
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?
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)