Örnek değişkenine sınıfın dışından erişin


82

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:


148

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 .


6
Sen gerektiğini değil o kapsüllemesini ihlal ettiği örnek değişkenleri erişmek bu varsayılan yol yapmak.
Andrew Marshall

@knut biz sadece böyle bunu yapamaz h = Hello.newve h.method1ve h.hello?
nik7

3
@nlingutla ile bir erişimci tanımlayabilirsinizattr_reader :hello
knut

O olmaz alias my_hello hello, değil alias :my_hello :hello?
Fon Monica'nın Davası

1
Benim için bu, halka açık bir şey yapmak istemediğiniz özellikler için harika.
baash05

20

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.