インスタンス変数がクラスに属している場合@hello
、クラス インスタンスを使用してインスタンス変数 (例: ) に直接アクセスできますか?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
インスタンス変数がクラスに属している場合@hello
、クラス インスタンスを使用してインスタンス変数 (例: ) に直接アクセスできますか?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
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 で定義されている場合:コードでクラスを変更し、クラスに新しい関数を挿入できます。