Bir örnek değişkeni bir sınıfa aitse, örnek değişkenine (örneğin @hello) doğrudan sınıf örneğini kullanarak erişebilir miyim ?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
Yanıtlar:
Evet, şu şekilde kullanabilirsiniz 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"
Değişken tanımsız ise (örneğimde ilk çağrısı instance_variable_get) alırsınız nil.
Andrew'un yorumunda bahsettiği gibi:
Kapsüllemeyi ihlal ettiğinden, bunu örnek değişkenlerine erişmenin varsayılan yolu yapmamalısınız.
Daha iyi bir yol, bir erişimci tanımlamaktır:
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"
Başka bir yöntem adı istiyorsanız, olabilir diğer ad erişimci: alias :my_hello :hello.
Ve sınıf kodunuzda değil de bir mücevherde tanımlanmışsa: Kodunuzdaki sınıfları değiştirebilir ve sınıflara yeni işlevler ekleyebilirsiniz .
h = Hello.newve h.method1ve h.hello?
attr_reader :hello
alias my_hello hello, değil alias :my_hello :hello?
Bunu arayarak attr_readerveya şu şekilde de başarabilirsiniz attr_accessor:
class Hello
attr_reader :hello
def initialize
@hello = "pavan"
end
end
veya
class Hello
attr_accessor :hello
def initialize
@hello = "pavan"
end
end
Çağrı , verilen değişken için attr_readerbir oluşturacaktır getter:
h = Hello.new
p h.hello #"pavan"
Çağrı , verilen değişken için attr_accessorbir getterAND a oluşturacaktır setter:
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
Anlayabileceğiniz gibi kullanın attr_readerve attr_accessorbuna göre. Yalnızca attr_accessorbir getterAND a'ya ihtiyacınız olduğunda setterkullanın ve attr_readeryalnızca birgetter