90

インスタンス変数がクラスに属している場合@hello、クラス インスタンスを使用してインスタンス変数 (例: ) に直接アクセスできますか?

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
puts h.method1
4

2 に答える 2

161

instance_variable_getはい、次のように使用できます。

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
p h.instance_variable_get(:@hello) #nil
p h.method1                        #"pavan" - initialization of @hello
p h.instance_variable_get(:@hello) #"pavan"

変数が未定義の場合 (instance_variable_get私の例では の最初の呼び出し)、 が得られnilます。


アンドリューが彼のコメントで述べているように:

カプセル化に違反するため、これをインスタンス変数にアクセスするデフォルトの方法にしないでください。

より良い方法は、アクセサーを定義することです:

class Hello
  def method1
    @hello = "pavan"
  end
  attr_reader :hello  
end

h = Hello.new
p h.hello #nil
p h.method1                        #"pavan" - initialization of @hello
p h.hello #"pavan"

別のメソッド名が必要な場合は、アクセサーに別名alias :my_hello :helloを付けることができます: .

また、クラスがコードではなく gem で定義されている場合:コードでクラスを変更し、クラスに新しい関数を挿入できます

于 2012-08-25T14:19:42.387 に答える