2016-11-01 17 views
0

Warum kann ich in Ruby den Wert der Variablen nicht direkt innerhalb der self.included-Methode eines Moduls festlegen?Variablen in `self.included` setzen

Zum Beispiel kann der folgende Code ausgibt NilClass (was anzeigt, dass die @sound Variable nicht gesetzt worden ist):

module Animal 
    def self.included(klass) 
    attr_accessor :sound 
    @sound = "Woof!" # <-- Variable assignment 
    end 

    def speak 
    puts @sound.class 
    end 
end 

class Dog 
    include Animal 
end 

dog = Dog.new 
dog.speak # => NilClass 

Wenn ich jedoch den Wert von @sound innerhalb des speak Methode des Moduls gesetzt (statt Innenseite self.included), dann wird die Variable korrekt gesetzt. Zum Beispiel kann die folgenden Code-Ausgänge String:

module Animal 
    def self.included(klass) 
    attr_accessor :sound 
    end 

    def speak 
    @sound = "Woof!" # <-- Variable assignment 
    puts @sound.class 
    end 
end 

class Dog 
    include Animal 
end 

dog = Dog.new 
dog.speak # => String 

würde ich beiden Codebeispiele String über der Ausgabe erwartet.

+0

Es macht ein bisschen mehr Sinn, wenn man darüber aus einer anderen Perspektive nachdenkt: Welchen "Dog's" @ Sound "soll enthalten sein? Alle von ihnen? Versuchen Sie wirklich, einen Standardwert für 'Dog's zu initialisieren, deren' @ Sound's noch nicht gesetzt sind? – Linuxios

Antwort

2

Im ersten Beispiel der Empfänger in self.included Block ist Dog Klasse, nicht, dass es beispielsweise, das heißt, Sie definieren Klasse Instanzvariable@sound, nicht Instanzvariable.

Sie können es durch

Dog.instance_variable_get(:@sound) # with first example 

speak Verfahren läuft zurück NilClass weil dog nicht @sound Instanzvariable definiert hat.

Im zweiten Beispiel Sie definieren ein Instanzvariable@sound, damit es funktioniert wie erwartet.

+0

Ah! Das macht jetzt viel mehr Sinn. Vielen Dank! Falls jemand interessiert ist, habe ich meinen Code anhand dieser Antwort neu geschrieben: http://paste.ofcode.org/mkAEyhmPWANfthk2E9rY66 – filmnut

Verwandte Themen