아래 코드의 수퍼 클래스에서 모든 서브 클래스에 인스턴스 변수가 필요합니다.수퍼 클래스의 서브 클래스의 클래스 인스턴스 변수 초기화
아래의 코드는이를 수행하지만 가능한 모든 하위 클래스에 대해 해당 변수를 제대로 초기화하지 못합니다.
내 수퍼 클래스의 고유 클래스를 열었습니다. 내가 초기화 가능한 모든 sublcasses을하고 싶은
class SomeSuperClass
class << self
attr_accessor :variable
@variable = ':)' # This does't seem to have any effect
end
self.variable = 'This only works for the superclass'
end
class SubClass < SomeSuperClass; end
puts SomeSuperClass.variable # => 'This only works for the superclass'
puts SubClass.variable # => ''
SomeSuperClass.variable = 'I am the superclass'
SubClass.variable = 'I am the subclass'
puts SomeSuperClass.variable # => 'I am the superclass'
puts SubClass.variable # => 'I am the subclass'
: 여기에 (도 rubyfiddle에서) 코드입니다. 처음 두 puts에서는 SomeSuperClass.variable
만 초기화됩니다. 모든 하위 클래스에 대해이 변수를 초기화하는 방법을 모르겠습니다. 어떤 아이디어?
내가 찾은 가장 좋은 해결책은 같이 접근을 무시하고 게으른 초기화 변수에있다 :
class SomeSuperClass
def self.variable
@variable ||= 'Hi'
end
end
동기 :
나는 주어진 클래스의 모든 서브 클래스가 필요합니다, Vigilant라고 부르면 직접 하위 클래스에서 일어나는 일을 모니터 할 수 있습니다. 이 정보는 클래스에 저장되므로 각각 정보가 다릅니다.
두 클래스 A < B가 동일한 변수를 수정하므로 클래스 변수를 사용할 수 없습니다. 서브 클래스에 직접 액세스 할 수 없기 때문에 경계 클래스의 모든 서브 클래스에 서브 클래스에 대한 정보를 저장하고 검색하는 기능이 필요했습니다. 고유치 클래스를 여는 접근을 정의함으로써
는 말할 수 : 방법 (접근)는 슈퍼 클래스의 고유 클래스에 추가 되었기 때문에
A.singleton_class.instance_eval { attr_accessor :x }
모든 서브 클래스가 class B < A; end
는 지금 B.x
을 할 수있는 B, 및 따라서 조회에서 찾을 수 있습니다.
그리고 첫 번째 예는 B.x는 여기서 X는 내가 정말 이해 아니에요 것은 지금 A.x
에서다르다는 것을 보여줍니다; 변수가 아니라 접근 자. 내가 B.instance_variables
을 경우 내가 모든 서브 클래스가 싱글 톤 클래스/eigenclass에 변수를 갖고 싶어 B.singleton_class.instance_variables
'puts '가있는 행은 도움이되지 않습니다. 모든. 당신은 그들로부터 어떤 결과를 얻습니까? – sawa
문제는 완전히 명확하지 않습니다. 처음에는 변수를 공유하고 싶지 않다고 썼습니다. 그런 다음 나중에 변수를 공유하려는 것처럼 작성했습니다. 변수를 공유하고 싶은 부분과 공유하지 않으려는 부분은 무엇입니까? – sawa
당신은 바로 @sawa입니다, 출력으로 편집하겠습니다. 어쨌든, 그 이유는 내가 rubyfiddle을 만들었습니다 – Logain