Wenn eine Instanzvariable zu einer Klasse gehört, kann ich dann @hello
direkt über die Klasseninstanz auf die Instanzvariable (z. B. ) zugreifen ?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
quelle
Wenn eine Instanzvariable zu einer Klasse gehört, kann ich dann @hello
direkt über die Klasseninstanz auf die Instanzvariable (z. B. ) zugreifen ?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
Ja, Sie können Folgendes verwenden 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"
Wenn die Variable undefiniert ist (erster Aufruf von instance_variable_get
in meinem Beispiel), erhalten Sie nil
.
Wie Andrew in seinem Kommentar erwähnt:
Sie sollten dies nicht als Standard für den Zugriff auf Instanzvariablen festlegen, da dies die Kapselung verletzt.
Ein besserer Weg ist, einen Accessor zu definieren:
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"
Wenn Sie einen anderen Methodennamen möchten, können Sie den Accessor als Alias verwenden : alias :my_hello :hello
.
Und wenn die Klasse nicht in Ihrem Code, sondern in einem Juwel definiert ist: Sie können Klassen in Ihrem Code ändern und neue Funktionen in Klassen einfügen .
h = Hello.new
undh.method1
und machenh.hello
?attr_reader :hello
alias my_hello hello
nicht soalias :my_hello :hello
?Sie können dies auch erreichen, indem Sie anrufen
attr_reader
oderattr_accessor
wie folgt:class Hello attr_reader :hello def initialize @hello = "pavan" end end
oder
class Hello attr_accessor :hello def initialize @hello = "pavan" end end
Durch Aufrufen
attr_reader
wird eingetter
für die angegebene Variable erstellt:h = Hello.new p h.hello #"pavan"
Durch Aufrufen
attr_accessor
wird eingetter
UNDsetter
für die angegebene Variable erstellt:h = Hello.new p h.hello #"pavan" h.hello = "John" p h.hello #"John"
Wie Sie vielleicht verstehen, verwenden Sie
attr_reader
undattr_accessor
entsprechend. Verwendenattr_accessor
Sie nur, wenn Sie eingetter
UND benötigen,setter
und verwendenattr_reader
Sie, wenn Sie nur ein UND benötigengetter
quelle