は、我々はRubyのattr_accessorは自動的に属性のインスタンス変数を作成しますか?例えば
class MyClass
attr_accessor :something
end
を書きますが、明示的にインスタンス変数@something
でinitializeメソッドを作成しなかった場合、Rubyはそれを自動的に作成するのでしょうか?
は、我々はRubyのattr_accessorは自動的に属性のインスタンス変数を作成しますか?例えば
class MyClass
attr_accessor :something
end
を書きますが、明示的にインスタンス変数@something
でinitializeメソッドを作成しなかった場合、Rubyはそれを自動的に作成するのでしょうか?
いいえインスタンス変数は、割り当てられるまで定義されていません。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
並べ替えRubyでは、インスタンス変数が最初に割り当てられたときにインスタンス変数が作成されます。これはプログラマーにとっては完全に透過的です。割り当てられるまで、デフォルトはnilになります。
例:あなたはインスタンス変数に値を割り当てるまで
class Foo
attr_accessor :bar
def baz
@nonexistant
end
end
f.bar #=> nil
f.baz #=> nil
f.bar = 4
f.bar #=> 4
、それは未定義ゼロの状態で浮かびます。