Es gibt eine Reihe von Problemen mit Ihrem Code. Lasst uns eins nach dem anderen durchgehen.
Aus der Dokumentation,
method_missing(*args) private Invoked by Ruby when obj is sent a message it cannot handle.
bezieht sich hier auf die message
method
. In Rubin, wenn Sie eine Methode für ein Objekt anrufen, sie ist send
eigentlich ein message
auf den ing object
Um dies besser zu verstehen, versuchen Sie dies in dem irb Shell.
1+2
=> 3
1.send(:+,2)
=> 3
Hier 1 und 2 sind Objekte der Fixnum
Klasse. Sie können dies mithilfe von 1.class
bestätigen. Ok, zurück zu deiner Frage. Daher sollte eine method_missing
Methode für eine Instanz aufgerufen werden.
team = Team.new
team.hawks
Wenn Sie die oben Stück Code versuchen, erhalten Sie eine Fehlermeldung erhalten dass 'fetch': key not found: :roster (KeyError)
Sie können dieses Problem umgehen, indem Sie eine default value
als zweiten Parameter zu fetch
Methode übergeben. Ersetzen Sie Ihre initialize
Methode mit
def initialize(stats = {})
@cust_roster = stats.fetch(:roster, [])
@cust_total_per = stats.fetch(:per, 0)
@cust_name = stats.fetch(:name, "anon")
@cust_best_player = stats.fetch(:best, "anon")
@@teams << self
Ende
Wenn Sie das Skript ausführen, erhalten Sie eine stack level too deep (SystemStackError)
bekommen wegen eines kleinen Schreibfehler in dieser Linie.
str = methID.id2name
In der Methodendefinition, sind Sie ein Argument mit dem Namen methId
empfangen, aber innerhalb Sie versuchen methID
zu nennen. Fix it mit
str = methId.id2name
Wenn Sie Ihr Skript ausführen, werden Sie wieder einen Fehler zu sagen undefined method uppercase for "hawks":String (NoMethodError)
Dies ist, weil es keine uppercase
Methode auf Strings ist. Sie sollten stattdessen die Methode upcase
verwenden.
Team.new(roster:[], per: 0, name: str.upcase, best: 0)
und Sie sollten gut gehen.
Weitere, http://apidock.com/ruby/BasicObject/method_missing
hoffe, das hilft sehen!
Meinst du nicht Hawks = Team.new.hawks? 'Team.hawks' versucht, die nicht existierende Klassenmethode' Falken' aufzurufen. –
Oder vielleicht 'def self.method_missing'? – ScottJ
nein, das nicht funktioniert und da Team.new bereits eine Funktion ist, wird es nicht ausführen method_missing –