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. .mmodule M def m self.class::GOAL end endなるなる^^;
メタプログラミングRubyposted with amazlet at 10.11.04
*1:継承が深いので、詳細を調べるのがメンドくさいのデスw;