Rubyのクラス継承に割り込んで定数を参照

 superclassで定義されている定数*1
moduleで使いたいケースが有りまして^^;
以下のような感じです。


 まあ、当たり前だが以下はErrorです。

class B
  GOAL = 100 
end

module M
  def m
    GOAL
  end
end

class C < B
  include M
end

p C.new.m #=>in `m': uninitialized constant M::GOAL (NameError)

 moduleなので、継承に割り込めてるのですが、う〜ん。

p C.ancestors  #=>[C, M, B, Object, Kernel]

 定数は駄目ですが、
メソッドなら問題なしです。

class B
  #GOAL=100
  def goal
    100
  end
end

module M
  def m
    #GOAL
    goal
  end
end

class C < B
  include M
end


p C.new.m #=> 100

 でも参照した相手は、継承元の定数ですので
お手上げな状態です。


 イメージとしては、classCとclassBの継承に
こんな感じで割り込みたいのですけど。

class B
  GOAL = 100 
end

class M < B
  def m
    GOAL
  end
end

class C < M
  
end

p C.new.m  #=> 100

 が、うまい方法が思いつかなかったので
以下のようにメタメタとメタプログラミングしました><

class B
  GOAL = 100 
end

module M
  def self.included subclass
    @@base = subclass
  end
  
  def m
    p @@base #=> C
    
    @@base::GOAL
  end
end

class C < B
  include M
end

p C.new.m

 @@baseがウザッたいのデスw<

誰か、もっといい方法が有ったら教えてくださいm(_ _)m

 で、コメントで教えていただきました。
ありがとうございますm. .m

module M
  def m
    self.class::GOAL
  end
end

 なるなる^^;

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 6309

*1:継承が深いので、詳細を調べるのがメンドくさいのデスw;