[Rubby] 상속 가능한 클래스 속성 정의

7246 단어 RubyRails

하고 싶은 일


계승 가능한 클래스 속성을 정의하고 싶습니다.
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

참고 자료


  • 총 187페이지, Active Support 핵심 확장 기능, 총 187페이지, class-attribute
  • 옵션도 일본어로 상세히 설명한다.
  • Inherit class-level instance variables in Ruby?
  • Class-level instance variables
  • 좋은 웹페이지 즐겨찾기