2013-03-20 2 views
2

Что касается метода классаException.exception, официальная документация (http://www.ruby-doc.org/core-2.0/Exception.html#method-c-exception) говорит:Ошибка в документации класса исключений Ruby?

При отсутствии аргумента, или если аргумент является такой же, как приемник, вернуть трубку. В противном случае создайте новый объект исключения из того же класса, что и получатель, но с сообщением, равным string.to_str.

Это верно для метода экземпляра с тем же именем, но не для метода класса.

ExampleError.exception не возвращает приемник:

class ExampleError < Exception; end 

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

ответ

3

Да, документация спутать. Генератор документации, вероятно, путается, потому что Exception имеет метод класса и метод экземпляра с тем же именем.

Если мы посмотрим на the 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 
+0

Спасибо. Я понял, что Exception.new и Exception.exception производят один и тот же вывод, я просто был смущен, что это противоречило документации. Ваш ответ велик. – yonso

Смежные вопросы