2011-12-03 4 views
2
class A 
    def set(v) 
    @@v = v 
    end 
    def put 
    puts @@v 
    end 
end 

class B < A 
end 
class C < A 
end 

B.new.set 'b' 
B.new.put # => b 
C.new.set 'c' 
C.new.put # => c 
B.new.put # => c 

왜? 마지막으로 B.에 B를 쓰려면 어떻게해야합니까?상속 클래스의 루비 및 클래스 변수

+0

인스턴스 변수를 원하십니까? (예 : @@ v 대신 @v) – cvshepherd

답변

5

여기 주제에 대한 좋은 기사 - Class and Instance Variables In Ruby입니다.

class A 
    class << self 
    attr_accessor :class_var 
    end 

    def set_class_var(value) 
    self.class.class_var = value 
    end 

    def get_class_var 
    self.class.class_var 
    end 
end 

class B < A; end 

A.class_var = 'a' 
B.class_var = 'b' 
puts A.class_var # => a 
puts B.class_var # => b 

A.new.set_class_var 'aa' 
B.new.set_class_var 'bb' 
puts A.new.get_class_var # => aa 
puts B.new.get_class_var # => bb 

당신이 Class 클래스의 인스턴스로 약 A을 생각해야 그것을 이해하기 위해 (그리고 루비에 어떻게입니다) :

기본적으로, 당신이 할 수있는 일은이다. 그러나 루비의 모든 개체가 개체 자체에 정의 된 방법과 같은 오브젝트 특정 물건을 저장하는 자신의 싱글 톤 클래스가 있습니다이 경우 foo에서

a = A.new 
def a.foo 
    puts 'foo' 
end 

a 개체에 대한 아니라 A 클래스의 모든 인스턴스에 대해 방법을 정의한다. 그리고 객체의 싱글 톤 클래스의 메소드를 정의하는 또 다른 방법은 같다 :

우리는 우리의 A 클래스의 싱글 톤 클래스의 맥락에서 class_var 속성 접근을 정의하기 위해이 방법을 사용하는 첫 번째 코드 조각에서
class << a # open a's singleton class 
    def bar # define method that will be available only on 'a' object 
    puts 'bar' 
    end 
end 

이 (가 조금 까다로운 , 그래서 그것에 대해 생각할 필요가 있습니다). 결과 클래스 자체는 class_var 변수와 그 자손 클래스 B을가집니다. 차이점은 각자 자신의 간섭이없는 변수 인 class_var입니다.

+0

감사합니다. 멋진 답변입니다. – Ximik

-1

클래스 변수 (@@ 변수)에 값을 할당하면 클래스의 모든 인스턴스에 값이 설정됩니다. "아직 생성되지 않은"인스턴스에 대해서도 "설정"됩니다. 그럼, 이것을 고려하십시오 ...

B.new.set 'b' # OK, that set @@v for that particular instance of B 

B.new.put # Hey, you just created *another* new instance of B! 

@@ v는 어떻게 그 값을 가질 수 있습니까? @@ V의 두 번째 객체의 값은 @@ V가 클래스 변수 것을, 사실을 제외 설정되지 않은 것, 그래서 클래스의 모든 예를 들어 같은 값을가집니다.

+1

실제 문제는 Ruby의 클래스 변수가 실제로 클래스 - 계층 변수라는 것입니다. 클래스는 클래스 변수를 모든 자손과 공유합니다. –

2

또 다른 옵션은 레일스에서 ​​class_inheritable_accessor code을 꺼내 클래스에 포함시키는 것입니다. 좋은 토론과 코드의 내용은 here을 참조하십시오.

아마 클래스 변수를 원하지 않을 수도 있습니다.

+0

링크를 공유해 주셔서 감사합니다. 나는 그것을 읽을 것이다. – Ximik

+1

@Ximik 문제가 없습니다. 이것은 기본적으로 KL-7의 대답을 확장하고 계층 적으로 표현한 것입니다. –