2013-03-20 5 views

答えて

28

いいえインスタンス変数は、割り当てられるまで定義されていません。attr_accessorは自動的に割り当てられません。

未定義のインスタンス変数にアクセスしようとすると、nilが返されますが、はその変数を定義しません。彼らはまでと書くまで、実際には定義されません。 attr_accessorはこの動作に依存しており、ゲッタ/セッタを定義する以外は何も行いません。

あなたは.instance_variablesをチェックアウトすることにより、これを確認することができます。

class Test 
    attr_accessor :something 
end 

xの新しいインスタンスが何のインスタンス変数を持っていない:

x = Test.new # => #<Test:0xb775314c> 
x.instance_variables # => [] 

ゲッターを呼び出すと、@somethingが定義になることはありません。

x.something # => nil 
x.instance_variables # => [] 

Inセッターをvokingは定義されてなることを原因@somethingを行いますバックnilからsomethingの設定

x.something = 3 # => 3 
x.instance_variables # => ["@something"] 

instance_variablesを戻すことはありませんので、我々は返される最初の空の配列は、単にの場合ではないことを確認することができますinstance_variablesを省略nil値:

x.something = nil # => nil 
x.instance_variables # => ["@something"] 

ます。また、これは単にattr_accessorに固有の動作ではないことを確認することができます。

class Test 
    def my_method 

    @x # nil 

    instance_variables # [] 

    @x = 3 

    instance_variables # ["@x"] 
    end 
end 

Test.new.my_method 
2

並べ替えRubyでは、インスタンス変数が最初に割り当てられたときにインスタンス変数が作成されます。これはプログラマーにとっては完全に透過的です。割り当てられるまで、デフォルトはnilになります。

例:あなたはインスタンス変数に値を割り当てるまで

class Foo 
    attr_accessor :bar 
    def baz 
    @nonexistant 
    end 
end 
f.bar #=> nil 
f.baz #=> nil 
f.bar = 4 
f.bar #=> 4 

、それは未定義ゼロの状態で浮かびます。

関連する問題