[Rubby] 상속 가능한 클래스 속성 정의
하고 싶은 일
계승 가능한 클래스 속성을 정의하고 싶습니다.class A
self.x = :hoge
end
class B < A
end
class C < B
self.x = :fuga
end
A.x #=> :hoge
B.x #=> :hoge (親の x を継承する。)
C.x #=> :fuga (再定義した場合はその値を使う。)
유일한 뛰어난 방법
Active Support 코어를 사용한 확장Class#class_attributerequire 'active_support/core_ext/class/attribute'
class A
class_attribute :x
self.x = :hoge
end
class B < A
end
class C < B
self.x = :fuga
end
A.x #=> :hoge
B.x #=> :hoge
C.x #=> :fuga
다른 생각
클래스 변수 사용(실패)
클래스 변수도 하위 클래스를 공유합니다. 하위 클래스에 대입할 수 있기 때문에 이 용도로 사용할 수 없습니다.class A
@@x = :hoge
end
class B < A
end
class C < B
@@x = :fuga
end
A.class_variable_get(:@@x) #=> :fuga 😭
B.class_variable_get(:@@x) #=> :fuga 😭
C.class_variable_get(:@@x) #=> :fuga
클래스 인스턴스 변수 사용(실패)
클래스 인스턴스 변수는 하위 클래스와 공유되지 않으며 각 클래스에서 독립적입니다.하지만 물려받지 못했다.class A
@x = :hoge
end
class B < A
end
class C < B
@x = :fuga
end
A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> nil 😭
C.instance_variable_get(:@x) #=> :fuga
클래스 인스턴스 변수를 사용하여 상위 클래스 값 상속(성공)
class A
def self.inherited(subclass)
subclass.instance_variable_set(:@x, @x)
end
@x = :hoge
end
class B < A
end
class C < B
@x = :fuga
end
A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> :hoge
C.instance_variable_get(:@x) #=> :fuga
참고 자료
class A
self.x = :hoge
end
class B < A
end
class C < B
self.x = :fuga
end
A.x #=> :hoge
B.x #=> :hoge (親の x を継承する。)
C.x #=> :fuga (再定義した場合はその値を使う。)
Active Support 코어를 사용한 확장Class#class_attribute
require 'active_support/core_ext/class/attribute'
class A
class_attribute :x
self.x = :hoge
end
class B < A
end
class C < B
self.x = :fuga
end
A.x #=> :hoge
B.x #=> :hoge
C.x #=> :fuga
다른 생각
클래스 변수 사용(실패)
클래스 변수도 하위 클래스를 공유합니다. 하위 클래스에 대입할 수 있기 때문에 이 용도로 사용할 수 없습니다.class A
@@x = :hoge
end
class B < A
end
class C < B
@@x = :fuga
end
A.class_variable_get(:@@x) #=> :fuga 😭
B.class_variable_get(:@@x) #=> :fuga 😭
C.class_variable_get(:@@x) #=> :fuga
클래스 인스턴스 변수 사용(실패)
클래스 인스턴스 변수는 하위 클래스와 공유되지 않으며 각 클래스에서 독립적입니다.하지만 물려받지 못했다.class A
@x = :hoge
end
class B < A
end
class C < B
@x = :fuga
end
A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> nil 😭
C.instance_variable_get(:@x) #=> :fuga
클래스 인스턴스 변수를 사용하여 상위 클래스 값 상속(성공)
class A
def self.inherited(subclass)
subclass.instance_variable_set(:@x, @x)
end
@x = :hoge
end
class B < A
end
class C < B
@x = :fuga
end
A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> :hoge
C.instance_variable_get(:@x) #=> :fuga
참고 자료
class A
@@x = :hoge
end
class B < A
end
class C < B
@@x = :fuga
end
A.class_variable_get(:@@x) #=> :fuga 😭
B.class_variable_get(:@@x) #=> :fuga 😭
C.class_variable_get(:@@x) #=> :fuga
class A
@x = :hoge
end
class B < A
end
class C < B
@x = :fuga
end
A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> nil 😭
C.instance_variable_get(:@x) #=> :fuga
class A
def self.inherited(subclass)
subclass.instance_variable_set(:@x, @x)
end
@x = :hoge
end
class B < A
end
class C < B
@x = :fuga
end
A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> :hoge
C.instance_variable_get(:@x) #=> :fuga
총 187페이지, Active Support 핵심 확장 기능, 총 187페이지, class-attribute
Reference
이 문제에 관하여([Rubby] 상속 가능한 클래스 속성 정의), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/QUANON/items/bcd1cb441e62b13fd513텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)