16

たとえば、次のように書くと

class MyClass
  attr_accessor :something
end

インスタンス変数で初期化メソッドを明示的に作成していませんが@something、Rubyは自動的に作成しますか?

4

2 に答える 2

31

いいえ。インスタンス変数は、割り当てるまで定義され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
于 2013-03-20T02:57:33.033 に答える
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

インスタンス変数に値を代入するまで、値は未定義の nil 状態で浮動します。

于 2013-03-20T02:54:53.893 に答える