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.new
ve h.method1
ve h.hello
?
attr_reader :hello
alias my_hello hello
, değil alias :my_hello :hello
?
Bunu arayarak attr_reader
veya ş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_reader
bir oluşturacaktır getter
:
h = Hello.new
p h.hello #"pavan"
Çağrı , verilen değişken için attr_accessor
bir getter
AND 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_reader
ve attr_accessor
buna göre. Yalnızca attr_accessor
bir getter
AND a'ya ihtiyacınız olduğunda setter
kullanın ve attr_reader
yalnızca birgetter