인스턴스 변수가 클래스에 속하는 @hello
경우 클래스 인스턴스를 사용하여 인스턴스 변수 (예 :)에 직접 액세스 할 수 있습니까?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
답변
예, 다음 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에 정의되어있는 경우 : 코드에서 클래스 를 수정 하고 새로운 함수를 클래스에 삽입 할 수 있습니다 .
답변
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
하면 주어진 변수에 대해 getter
AND a 가 생성됩니다 setter
.
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
당신이 이해 한대로 사용 attr_reader
하고 attr_accessor
그에 따라. 만 사용하십시오 attr_accessor
당신이 필요로하는 경우 getter
와 setter
사용 attr_reader
당신은 단지 필요로 할 때getter