たとえば、次のように書くと
class MyClass
attr_accessor :something
end
インスタンス変数で初期化メソッドを明示的に作成していませんが@something
、Rubyは自動的に作成しますか?
たとえば、次のように書くと
class MyClass
attr_accessor :something
end
インスタンス変数で初期化メソッドを明示的に作成していませんが@something
、Rubyは自動的に作成しますか?
いいえ。インスタンス変数は、割り当てるまで定義されattr_accessor
ず、自動的には定義されません。
未定義のインスタンス変数にアクセスしようとすると が返されますがnil
、その変数は定義されていません。書き込むまで、実際には定義されません。attr_accessor
はこの動作に依存しており、getter/setter を定義する以外は何もしません。
チェックアウトすることでこれを確認できます.instance_variables
:
class Test
attr_accessor :something
end
の新しいインスタンスにx
はインスタンス変数がありません:
x = Test.new # => #<Test:0xb775314c>
x.instance_variables # => []
getter を呼び出しても@something
定義されません。
x.something # => nil
x.instance_variables # => []
セッターを呼び出すと、次のよう@something
に定義されます。
x.something = 3 # => 3
x.instance_variables # => ["@something"]
に戻しsomething
ても元に戻らnil
ない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
並べ替え。Ruby では、インスタンス変数は最初に割り当てられたときに作成されます。これは、プログラマに対して完全に透過的です。割り当てられるまで、デフォルトは nil です。
元:
class Foo
attr_accessor :bar
def baz
@nonexistant
end
end
f.bar #=> nil
f.baz #=> nil
f.bar = 4
f.bar #=> 4
インスタンス変数に値を代入するまで、値は未定義の nil 状態で浮動します。