Ruby Forum Ruby-dev > [ruby_1_8] Class#inherited$B$N8F$P$l$k%?%$%_%s%0(B

Posted by Kouhei Sutou (Guest)
on 10.05.2008 15:31
(Received via mailing list)
$B?\F#$G$9!#(B

Class#inherited$B$,Dj5A$5$l$F$$$k$H7Q>5$7$?;~$K8F$S=P$5$l$^$9(B
$B$,!"(Bruby_1_8$B$G$O%V%m%C%/IU$-$GL5L>%/%i%9$rDj5A$7$?$H$-$N5sF0(B
$B$,$*$+$7$$5$$,$7$^$9!#(B

  % ruby -e '
  class A
    def A.inherited(sub)
      p :A
    end
  end

  Class.new(A) do
    p :anonymous
  end
  '
  :anonymous
  :A

trunk$B$G$O%V%m%C%/$,I>2A$5$l$kA0$K(Binherited$B$,8F$P$l$^$9!#(B

  % ruby1.9 -e '
  class A
    def A.inherited(sub)
      p :A
    end
  end

  Class.new(A) do
    p :anonymous
  end
  '
  :A
  :anonymous

$BDL>o$N%/%i%9Dj5A$G$O(Bclass ... end$BFb$,<B9T$5$l$kA0$K(Binherited
$B$,8F$P$l$k$3$H$r9M$($k$H!"(Btrunk$B$G$N5sF0$NJ}$,<+A3$J5$$,$7$^(B
$B$9!#(B

$B$A$J$_$K!"(Btrunk$B$G$3$N=$@5$,9T$o$l$?$N$O(B2005-03-04$B$N(Br8068$B$N$G(B
$B$+$$%3%_%C%H$NCf$G$9!#(B

Index: object.c
===================================================================
--- object.c  (revision 16346)
+++ object.c  (working copy)
@@ -1564,8 +1564,8 @@
     }
     RCLASS(klass)->super = super;
     rb_make_metaclass(klass, RBASIC(super)->klass);
+    rb_class_inherited(super, klass);
     rb_mod_initialize(klass);
-    rb_class_inherited(super, klass);

     return klass;
 }
Index: test/ruby/test_class.rb
===================================================================
--- test/ruby/test_class.rb  (revision 0)
+++ test/ruby/test_class.rb  (revision 0)
@@ -0,0 +1,34 @@
+require 'test/unit'
+
+class TestClass < Test::Unit::TestCase
+  class InheritedDetector
+    @@sub_classes = []
+    class << self
+      def sub_classes
+        @@sub_classes
+      end
+
+      def inherited(sub)
+        @@sub_classes << sub
+      end
+    end
+  end
+
+  class InheritedClass < InheritedDetector
+  end
+
+  def test_s_inherited
+    assert_equal([InheritedClass], InheritedDetector.sub_classes)
+    inherited_class = Class.new(InheritedDetector)
+    assert_equal([InheritedClass, inherited_class],
+                 InheritedDetector.sub_classes)
+    sub_classes_snapshot = nil
+    inherited_class_with_block = Class.new(InheritedDetector) do
+      sub_classes_snapshot = InheritedDetector.sub_classes.dup
+    end
+    assert_equal([InheritedClass, inherited_class, 
inherited_class_with_block],
+                 InheritedDetector.sub_classes)
+    assert_equal([InheritedClass, inherited_class, 
inherited_class_with_block],
+                 sub_classes_snapshot)
+  end
+end
Posted by Yukihiro Matsumoto (Guest)
on 10.05.2008 19:02
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message "Re: [ruby-dev:34636] [ruby_1_8] 
Class#inherited$B$N8F$P$l$k%?%$%_%s%0(B"
    on Sat, 10 May 2008 22:30:13 +0900, Kouhei Sutou <kou@cozmixng.org> 
writes:

|Class#inherited$B$,Dj5A$5$l$F$$$k$H7Q>5$7$?;~$K8F$S=P$5$l$^$9(B
|$B$,!"(Bruby_1_8$B$G$O%V%m%C%/IU$-$GL5L>%/%i%9$rDj5A$7$?$H$-$N5sF0(B
|$B$,$*$+$7$$5$$,$7$^$9!#(B

|trunk$B$G$O%V%m%C%/$,I>2A$5$l$kA0$K(Binherited$B$,8F$P$l$^$9!#(B

|$BDL>o$N%/%i%9Dj5A$G$O(Bclass ... end$BFb$,<B9T$5$l$kA0$K(Binherited
|$B$,8F$P$l$k$3$H$r9M$($k$H!"(Btrunk$B$G$N5sF0$NJ}$,<+A3$J5$$,$7$^(B
|$B$9!#(B

trunk$B$NJ}$,!V$h$$5sF0!W$G$"$k$3$H$O3N$+$G$7$g$&$M(B($B$=$&;W$C$F(B
$BJQ$($?3P$($,$"$k(B)$B!#(B1.8$B$bB7$($?$$$N$O$d$^$d$^$G$9$,!"8_49@-$N(B
$BLdBj$b$"$k$N$GE,MQ$9$k$+$I$&$+$O(Bknu$B$5$s$K$*G$$;$7$^$9!#(B

$B$G$b!"J|CV$;$6$k$r$($J$$$+$J!#(B