From: rucila Date: 2008-03-23T23:48:22+09:00 Subject: [ruby-dev:34114] Is 'Class.new(Class)' valid? nagachika と申します。 RHGの逆襲に向けて class.c を読んでいて気がついたのですが 、 class ... end 構文でクラスを定義する場合は superclass に Class を指定すると例外が発生しますが、Class.new メソッド で クラスを生成する時には superclass(Class.new の引数)に Class を渡しても例外になりません。 これは意図的なものでしょうか? このようにしてできた「Classのサブクラス」やそれを 継承したクラスはインスタンスが生成できないので 普通のクラスとしては使えないと思うのですが、 何か特別な用途があるんでしょうか? 実行結果 irb-trunk --simple-prompt >> class Hoge < Class >> end TypeError: can't make subclass of Class from (irb):1 from irb-trunk:12:in `
' >> Hoge = Class.new(Class) => Hoge >> Hoge.superclass => Class >> Hoge.new TypeError: wrong instance allocation from (irb):5:in `new' from (irb):5 from irb-trunk:12:in `
' 意図的でないならこんな感じにすればいいのではないかと。 Index: class.c =================================================================== --- class.c (リビジョン 15828) +++ class.c (作業コピー) @@ -53,6 +53,9 @@ if (RBASIC(super)->flags & FL_SINGLETON) { rb_raise(rb_eTypeError, "can't make subclass of singleton class"); } + if (super == rb_cClass) { + rb_raise(rb_eTypeError, "can't make subclass of Class"); + } } VALUE @@ -60,9 +63,6 @@ { Check_Type(super, T_CLASS); rb_check_inheritable(super); - if (super == rb_cClass) { - rb_raise(rb_eTypeError, "can't make subclass of Class"); - } return rb_class_boot(super); } -------------------------------------- Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar http://pr.mail.yahoo.co.jp/toolbar/