클래스 외부에서 인스턴스 변수에 액세스


82

인스턴스 변수가 클래스에 속하는 @hello경우 클래스 인스턴스를 사용하여 인스턴스 변수 (예 :)에 직접 액세스 할 수 있습니까?

class Hello
  def method1
    @hello = "pavan"
  end
end

h = Hello.new
puts h.method1

답변:


148

예, 다음 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.


Andrew가 그의 의견에서 언급했듯이 :

캡슐화를 위반하므로 인스턴스 변수에 액세스하는 기본 방법으로 설정해서는 안됩니다.

더 나은 방법은 접근자를 정의하는 것입니다.

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"

다른 메서드 이름을 원하면 접근 자의 별칭을 지정할 수 alias :my_hello :hello있습니다..

클래스가 코드에 정의되어 있지 않고 gem에 정의되어있는 경우 : 코드에서 클래스수정 하고 새로운 함수를 클래스에 삽입 할 수 있습니다 .


6
캡슐화를 위반하므로 인스턴스 변수에 액세스하는 기본 방법으로 설정 해서는 안됩니다 .
Andrew Marshall

@knut 우리처럼이 작업을 수행 할 수 h = Hello.newh.method1h.hello?
nik7

3
@nlingutla 접근자를 정의 할 수 있습니다attr_reader :hello
knut

그것은하지 않을까요 alias my_hello hello하지 alias :my_hello :hello?
기금 모니카의 소송

1
저에게 이것은 공개하고 싶지 않은 사양에 적합합니다.
baash05

20

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하면 주어진 변수에 대해 getterAND a 가 생성됩니다 setter.

h = Hello.new
p h.hello        #"pavan"
h.hello = "John"
p h.hello        #"John"

당신이 이해 한대로 사용 attr_reader하고 attr_accessor그에 따라. 만 사용하십시오 attr_accessor당신이 필요로하는 경우 gettersetter사용 attr_reader당신은 단지 필요로 할 때getter

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.