2013-12-09 1 views
0

클래스 인스턴스 내에서 인스턴스 변수를 통해 변수 값을 읽어야한다는 것을 알고 있습니다. 그러나 자기를 통해 읽는 결과는 무엇입니까?자체를 사용하여 인스턴스 변수 읽기

아래의 예를 참조 :

당신의 예에서
class Test attr_writer :aa 
    def testing 
    puts @aa 
    puts self.aa <-- what are the consequences if I apply attr_reader :aa and try to read 'aa' via self.aa ? can I read other value by accident? 
    end 

    def self.bb 
    a = self.new 
    a.aa = "111" 
    a.testing 
    end 
end 

Test.bb 
+0

'puts self.aa'는'puts aa'와 같습니다. 그것은'self'가 기본 수신기이기 때문입니다. 'testing'은 인스턴스 메소드이기 때문에'Test' 인스턴스에 의해 호출되므로'self'는 메소드 내 인스턴스와 같습니다. 메소드 내에'puts "self = # {self}"'를 추가하여이를 확인할 수 있습니다. 'puts aa' (또는'puts self.aa')의 효과는 당신이'aa '를위한 접근자를 생성했는지에 달려 있습니다 (예를 들어'attr_reader : aa'). 만약 당신이 가지고 있다면,'puts aa'는 접근자를 통해 @aa의 값을 제공 할 것입니다; 그렇지 않은 경우 지역 변수 또는 메소드 'aa'가 없다는 것을 알리는 예외가 발생합니다. –

+0

좋아, 어떤 특별한 이유 : "그러나 @ varariable 대신에 메서드를 사용하는 것이 여러 가지 이유로 권장됩니다." ? –

답변

0

변수가 방금 self.new

사용하여 만든 개체에 대한 인스턴스 변수입니다 또한 아는 것이 중요하다에 testing 방법 자체 참조 내 클래스가 아닌 오브젝트와 생각하는 것 같습니다. bob 메서드 내에서 클래스 메서드이기 때문에 클래스에 대한 자체 참조입니다.

여전히 클래스 내에서 인스턴스 변수를 가질 수 있습니다 (모든 클래스 개체와 클래스 자체에서 액세스 할 수있는 클래스 변수 @@와 혼동하지 마십시오).

다음은 그 모습입니다.

class Test 

    class << self 
    attr_writer :bb 
    end 

    def self.bb 
    @bb 
    end 
end 

Test.bb = 1 
Test.bb 
+0

고맙습니다. 내 게시물을 편집하고 '클래스'를 '인스턴스'로 변경했습니다. –

+0

좋아요. 내가 작성한 내용을 이해하고 차이점을 이해합니다. 그러나 자체를 사용하여 변수를 읽으려고하면 무엇이 잘못 될지 궁금합니다. 테스트 메소드에서 @aa 대신 aa를 사용합니다. –

+0

attr_reader를 사용하는 경우 : aa는 def aa와 같은 메소드를 갖는 것과 같습니다. @aa; 끝 '그래서 거의 동일합니다. 그러나 @variable 대신이 메서드를 사용하는 것이 여러 가지 이유로 권장됩니다. –

관련 문제