インスタンス変数がクラスに属している場合、インスタンス変数にアクセスできますか(例:@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"
別のメソッド名が必要な場合は、アクセサをaliasalias :my_hello :hello
にできます。
そして、クラスがコードではなくgemで定義されている場合:コードで クラスを変更 し、クラスに新しい関数を挿入 することができます 。
次のように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
を使用してください。 getter
およびsetter
が必要な場合にのみattr_accessor
を使用し、getter
のみが必要な場合にattr_reader
を使用します