2016-08-19 2 views
1

Ich habe eine Team-Klasse in meinem Programm, und ich versuche, method_missing verwenden, aber anstelle der Funktion, wenn die Methode nicht existiert, gibt es mir einen Fehler: "undefined Methode` Falken für Team: Klasse (NoMethodError)“Method_missing nicht ausgeführt, wenn es sollte

Mein Code ist wie folgt:

class Team 
    attr_accessor :cust_roster, :cust_total_per, :cust_name, :cust_best_player 
    @@teams = [] 
    def initialize(stats = {}) 
    @cust_roster = stats.fetch(:roster) || [] 
    @cust_total_per = stats.fetch(:per) 
    @cust_name = stats.fetch(:name) 
    @cust_best_player = stats.fetch(:best) 
    @@teams << self 

    end 
    def method_missing(methId) 
    str = methID.id2name 
    Team.new(roster:[], per: 0, name: str.uppercase, best: 0) 

    end 



    class <<self 
    def all_teams 
     @@teams 
    end 
    end 

end 
hawks = Team.hawks 
+1

Meinst du nicht Hawks = Team.new.hawks? 'Team.hawks' versucht, die nicht existierende Klassenmethode' Falken' aufzurufen. –

+1

Oder vielleicht 'def self.method_missing'? – ScottJ

+0

nein, das nicht funktioniert und da Team.new bereits eine Funktion ist, wird es nicht ausführen method_missing –

Antwort

4

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 messagemethod. 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!

+0

wow vielen Dank kann ich nicht glauben, dass ich das –

+0

@AvyayVaradarajan verpasst habe, habe ich meine Antwort aktualisiert, um den Fehler über 'widerzuspiegeln Großbuchstabe "Methode. Schau mal –

+0

danke für die Hilfe –

0
class Team 
    attr_accessor :cust_roster, :cust_total_per, :cust_name, :cust_best_player 
    @@teams = [] 
    def initialize(stats = {roster: [], per: 0, name: "", best: 0}) # I added the default values here. 
    @cust_roster = stats.fetch(:roster) 
    @cust_total_per = stats.fetch(:per) 
    @cust_name = stats.fetch(:name) 
    @cust_best_player = stats.fetch(:best) 
    @@teams << self 

    end 
    def method_missing(name, *args) 
    self.cust_name = name.to_s.upcase 
    end 

    class << self 
    def all_teams 
     @@teams 
    end 
    end 

end 

team_hawks = Team.new #=> create an instance of Team class, I renamed the object to avoid confusions. 
team_hawks.hawks  #=> called method_missing which assigned the cust_name variable to "HAWKS" 

team_hawks.cust_name #=> HAWKS, so cust_name is assigned to be hawks. This is to check if the assignment worked. 

Hoffe, das ist, was Sie suchen.

Verwandte Themen