2010-12-29 6 views
4

Ich habe einige Probleme mit Ruby über Rückrufe (und Vererbung). Hier ist mein Code:Ruby: Wie man einen Callback durch Vererbung hakt

class Lmao 
    def initialize 
    @str = "HAHAHAHAHAHHAHAHAH" 
    @before_laughing = [] 
    end 

    def self.inherited(base) 
    base.extend(Callbacks) 
    end 

    def laughing 
    @before_laughing.each {|method| send(method) } 
    @str 
    end 
end 

module Callbacks 
    def before_laughing(*methods) 
    @before_laughing = methods 
    end 
end 

class Lol < Lmao 
    before_laughing :downcase_please 

    def downcase_please 
    @str.downcase! 
    end 
end 

a = Lol.new 
a.laughing # => "HAHAHAHAHAHHAHAHAH" 

Und wie Sie sehen können, mein bevor Rückruf Lachen nicht funktionieren ... weil das Array @before_laughing leer ist. Ich glaube, das kann behoben werden, indem ich die Art und Weise, wie ich * Methoden in eine Instanzmethode von Lol (von innerhalb von Callbacks) speichere, bearbeite. Aber ich sehe nicht wirklich, wie ...

Wenn Sie die Lösung kennen, danke für Ihr Licht!

+4

Sie haben mich LOL gemacht. Und 'LOL

+0

Ich habe auch darüber nachgedacht. Aber Lmao ist toller als Lol, also stelle ich es auf die Spitze. – moshimoshi

Antwort

1

Es gibt zwei verschiedene Instanzvariablen @before_laughing im Code genannt: Die eine ist eine Instanzvariable von Instanzen der Lmao-Klasse, die auf [] initialisiert wird (dh eine leere Array) in Lmao ‚s initialize Instanzmethoden und wird in Lmaolaughing Instanz Methode gelesen. Da die nur Stelle, an die diese Instanzvariable geschrieben wird, der Initialisierer ist, wird immer eine leere Array sein.

Das andere Instanz-Variable ist eine Instanzvariable des Lol Klassenobjekts selbst , die die Array[:downcase_please] Innenseite des before_laughing Verfahrens eingestellt werden. Dieser wird jedoch nie lesen.

+0

Wenn ich verstehe, ist die erste Instanz Variablen (die Sie aufgerufen haben: "eine Instanzvariable von Instanzen der Lmao-Klasse") ist eine Art Klassenvariable der Lmao-Klasse, nicht wahr. Seltsam; Ich finde den Weg nicht wirklich. – moshimoshi

3

Dank Mon_Ouie, die Lösung ist:

class Lmao 
    def initialize 
    @str = "HAHAHAHAHAHHAHAHAH" 
    end 

    def self.inherited(base) 
    base.extend(Callbacks) 
    end 

    def laughing 
    self.class.callbacks_before_laughing.each {|method| send(method) } 
    @str 
    end 
end 

module Callbacks 
    def before_laughing(*methods) 
    @before_laughing = methods 
    end 

    def callbacks_before_laughing 
    @before_laughing 
    end 
end 

class Lol < Lmao 
    before_laughing :downcase_please 

    def downcase_please 
    @str.downcase! 
    end 
end 

ziemlich genial.

Verwandte Themen