From: yugui@... Date: 2018-05-01T02:31:12+00:00 Subject: [ruby-dev:50529] [Ruby trunk Bug#14726] wrong message when superclass is not a Class Issue #14726 has been updated by yugui (Yuki Sonoda). どちらかというと元の仕様のほうに賛成で、これはバグではないという認識です。Classオブジェクトを期待していたのにC1オブジェクトが来たというのはどちらも `super` の属するクラスの話をしていて、そのパッチよりもバランスが取れています。 このエラーメッセージが分かりにくいのは冠詞が抜けているからではないでしょうか。 ```diff - rb_raise(rb_eTypeError, "superclass must be a Class (%"PRIsVALUE" given)", + rb_raise(rb_eTypeError, "superclass must be a Class (given a %"PRIsVALUE")", ``` ---------------------------------------- Bug #14726: wrong message when superclass is not a Class https://bugs.ruby-lang.org/issues/14726#change-71745 * Author: usa (Usaku NAKAMURA) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.6.0dev (2018-05-01 trunk 63310) [x64-mswin64_140] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- クラス定義の際に親クラスとして`Class`でないものを与えると`TypeError`になりますが、その際にエラーメッセージに与えられたもののクラス名が表示されるため、メッセージだけ見ると何が間違ってるのかわけがわからなくなっています。 ```ruby class C1; end class C2 < C1.new; end #=> TypeError (superclass must be a Class (C1 given)) ``` ここはクラス名ではなく与えられたオブジェクトそのものを表示すべきではないでしょうか? ```diff Index: class.c =================================================================== --- class.c (revision 63310) +++ class.c (working copy) @@ -221,7 +221,7 @@ { if (!RB_TYPE_P(super, T_CLASS)) { rb_raise(rb_eTypeError, "superclass must be a Class (%"PRIsVALUE" given)", - rb_obj_class(super)); + super); } if (RBASIC(super)->flags & FL_SINGLETON) { rb_raise(rb_eTypeError, "can't make subclass of singleton class"); Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 63310) +++ vm_insnhelper.c (working copy) @@ -3150,7 +3150,7 @@ if (VM_DEFINECLASS_HAS_SUPERCLASS_P(flags) && !RB_TYPE_P(super, T_CLASS)) { rb_raise(rb_eTypeError, "superclass must be a Class (%"PRIsVALUE" given)", - rb_obj_class(super)); + super); } vm_check_if_namespace(cbase); ``` -- https://bugs.ruby-lang.org/