2

class method に関してException.exception、公式ドキュメント ( http://www.ruby-doc.org/core-2.0/Exception.html#method-c-exception ) は次のように述べています。

引数がない場合、または引数がレシーバーと同じ場合は、レシーバーを返します。それ以外の場合は、レシーバーと同じクラスの新しい例外オブジェクトを作成しますが、メッセージは string.to_str と同じです。

これは、同じ名前のインスタンス メソッドには当てはまりますが、クラス メソッドには当てはまりません。

ExampleError.exception受信者を返しません:

class ExampleError < Exception; end

p ExampleError.class            # => Class
p ExampleError.exception.class  # => ExampleError
4

1 に答える 1

3

はい、ドキュメントは混乱しています。Exception同じ名前のクラス メソッドとインスタンス メソッドがあるため、ドキュメンテーション ジェネレーターが混乱している可能性があります。

sourceを見ると、次のように表示されます。

void
Init_Exception(void)
{
    rb_eException   = rb_define_class("Exception", rb_cObject);
    rb_define_singleton_method(rb_eException, "exception", rb_class_new_instance, -1);
    rb_define_method(rb_eException, "exception", exc_exception, -1);
    /* ... */

これはクラスメソッドを追加します:

rb_define_singleton_method(rb_eException, "exception", rb_class_new_instance, -1);

これはインスタンスメソッドを追加します:

rb_define_method(rb_eException, "exception", exc_exception, -1);

追跡するexc_exceptionと、ドキュメントがどこから来たのかがわかります。追跡すると、それが標準的な方法rb_class_new_instanceであることがわかります。つまり、これらはまったく同じことを行います。rb_class_new_instancenew

Exception.new
Exception.exception
于 2013-03-20T22:20:31.580 に答える