2016-11-01 30 views
0

Rubyでは、変数の値を、モジュールself.includedのメソッド内で直接に設定できないのはなぜですか?例えば`self.included`内の変数を設定する

、次のコードを出力NilClass@sound変数が設定されていないことを示す):

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 

しかし、私はモジュールのspeakメソッド内@soundの値を設定した場合(代わりに内部self.included)、変数が正しく設定されます。例えば、次のコードを出力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 

Iは、両方のコードのサンプル出力Stringに上記期待しているであろう。最初の例で

+0

別の観点から考えると、「Dog」の「@サウンド」が含まれていると考えられますか?それらのすべて? '@サウンド'がまだ設定されていない 'Dog'のデフォルト値を実際に初期化しようとしていますか? – Linuxios

答えて

2

self.includedブロック内の受信機は、Dogクラスではありません、それはあなたが@sound変数クラスのインスタンスではなく、インスタンス変数を定義している意味、インスタンスです。

あなたは

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

speak方法を実行して、それを確認することができますdog@soundインスタンス変数が定義されていないので、NilClassを返します。

2番目の例では、あなたが@sound変数インスタンスを定義している、あなたが期待するようので、それが動作します。

+0

ああ!これは今よりずっと意味をなさない。ありがとう!この回答に基づいて誰かが気にしている場合、私は自分のコードを次のように書き直しました:http://paste.ofcode.org/mkAEyhmPWANfthk2E9rY66 – filmnut

関連する問題