インスタンス変数がクラスに属している場合、クラスインスタンスを使用してインスタンス変数(例@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で定義されている場合:コード内のクラスを変更し、クラスに新しい関数を挿入できます。
h = Hello.new
、h.method1
andとandのようにこれを行うことはできませんh.hello
か?
attr_reader :hello
alias my_hello hello
ではないalias :my_hello :hello
でしょうか?
またattr_reader
、次のattr_accessor
ように呼び出すか、このようにすることでこれを実現できます。
class Hello
attr_reader :hello
def initialize
@hello = "pavan"
end
end
または
class Hello
attr_accessor :hello
def initialize
@hello = "pavan"
end
end
を呼び出すattr_reader
とgetter
、指定された変数のが作成されます。
h = Hello.new
p h.hello #"pavan"
を呼び出すattr_accessor
と、指定された変数のgetter
ANDが作成さsetter
れます。
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
あなたが理解かもしれませんが、使用attr_reader
してattr_accessor
それに応じて。のみ使用しattr_accessor
、あなたが必要とするときgetter
、ANDsetter
や使用attr_reader
だけ必要なときgetter