From: Christoph Date: 2002-04-19T19:08:45+09:00 Subject: Re: calling a class method in "class << obj" context "Yukihiro Matsumoto" wrote in message news:1019173510.282346.16617.nullmailer@picachu.netlab.jp... > Hi, > > In message "calling a class method in "class << obj" context" > on 02/04/19, Joel VanderWerf writes: > > |Why doesn't the singleton class of a inherit the foo method? > > Fixed in 1.7; should I backport this behavior? Playing around a bit I find the new ``meta behavior'' much richer and actually useful (see Joel's example) however I also don't miss it in 1.6. /Christoph ---- class Object def __meta res = class << self; self end res.meta_level = 1 res end def meta(level = 1) if level == 0 self elsif level == 1 __meta else __meta.meta(level-1) end end def assert_equal (l,r) raise "#{l} != #{l}" unless l == r end def test_meta_of_singleton puts meta(1).superclasses.reverse.join " <| " puts meta(2).superclasses.reverse.join " <| " puts "meta.superclass == type is meta(k)-invariant" puts "\n" (1..10).each do |i| assert_equal(meta(i).superclass, type.meta(i-1)) end end end class Class attr_writer :meta_level def meta_level @meta_level || 0 end def __meta res = class << self; self end res.meta_level = meta_level + 1 res end def superclasses res = [self] tmp = self res << tmp while tmp = tmp.superclass res end def test_meta puts meta(0).superclasses.reverse.join " <| " puts meta(1).superclasses.reverse.join " <| " puts meta(2).superclasses.reverse.join(" <| ") puts "meta(2).superclass == type (== Class) is meta(k)-invariant" puts "\n" (2..10).each do |i| assert_equal(meta(i).superclass, Class.meta(i-2)) end end end class A; end class B < A; end class C < B; end # Note calling C.meta(30) at this would result in an exception latter on Class.test_meta Module.test_meta C.test_meta C.new.test_meta_of_singleton ----- Object <| Module <| Class Object <| Module <| Class <| # <| # <| # Object <| Module <| Class <| #> meta(2).superclass == type (== Class) is meta(k)-invariant Object <| Module Object <| Module <| Class <| # <| # Object <| Module <| Class <| #> meta(2).superclass == type (== Class) is meta(k)-invariant Object <| A <| B <| C Object <| Module <| Class <| # <| # <| # <| # Object <| Module <| Class <| #> meta(2).superclass == type (== Class) is meta(k)-invariant Object <| A <| B <| C <| #> Object <| Module <| Class <| # <| # <| # <| # <| #>> meta.superclass == type is meta(k)-invariant ----