2

关于类方法 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_instance只是标准new方法。这意味着它们做的事情完全相同:

Exception.new
Exception.exception
于 2013-03-20T22:20:31.580 回答