2015-11-10 3 views
-1

я могу думать об этом в неправильном направлении, но это выглядит немного странно для меня:рубина класс суперкласс ноль - OOP

я собирался через документацию на ruby's everything is an object on rubymonk и попал в часть о суперкласса, на следующем примере:

p Foo.superclass 
p Foo.superclass.superclass 
p Foo.superclass.superclass.superclass 

Где Foo это класс, и получил следующее:

STDOUT: 

Object 
BasicObject 
nil 

Я был смущен, почему последний был nil, и я пошел вперед по проверке:

p Foo.superclass.superclass.superclass.superclass 

, который был бы эквивалентом p nil.superclass, и я получил следующее сообщение об ошибке:

undefined method `superclass' for nil:NilClass 

И когда я попытался следующий, я получил более запутанной:

enter image description here

Почему я буду в состоянии назвать superclass на Foo и п ot on nil, когда я могу назвать суперкласс по каждому из своих классов соответственно (Class и NilClass) - Foo и nil - оба экземпляра некоторых других class, который имеет superclass es.

Что особенного о nil? что пропало между nil и NilClass, что NilClass будет иметь superclass, а nil не будет?

ответ

2

В случае BasicObject, возвращаемое значение nil делает не указывать суперкласс. Он указывает отсутствие суперкласса. nil не является классом (nil - это экземпляр NilClass, классы - это экземпляры Class), это объект, представляющий идею «отсутствия».

Только классы имеют суперклассы. Вещи, которые не являются классами, не имеют кубков. Поскольку nil не является классом, у него нет суперкласса. Есть много других вещей, которые не имеют суперклассов: 1 не имеет суперкласса. 'Hello' не имеет суперкласса. [] не имеет суперкласса. На самом деле, не только эти объекты не имеют суперклассов, сама идея суперкласса для них даже не имеет смысла.

nil является экземпляром NilClass, NilClass не определяет метод экземпляра superclass и ни один не делает любой из его предков (Object, Kernel, BasicObject).

Будучи экземпляром Class, NilClassделает реагировать на superclass сообщения (потому что Class определяет метод экземпляра superclass), а его суперкласс Object.

Итак, мы имеем две различные интерпретации пропавшего суперкласса здесь:

  • BasicObject реагирует с nil, когда вы спросите его о его суперкласса, потому что он не один. Но это еще класс, а для классов вопрос о суперклассе имеет смысл, поэтому он ответит на ваш вопрос, но скажет вам «нет, у меня его нет».
  • nil, 1, и все другие объекты, которые не являются классами, даже откажутся ответить на ваш вопрос, потому что идея о том, что у них есть суперкласс, не имеет смысла.
+2

'NilClass' _does_ имеют суперкласс, хотя –

+0

Конечно, все классы, кроме одного, имеют суперкласса. Но вопрос был «что делает« nil »особенным», и ответ таков: «nil» не является особенным в отсутствии суперкласса, на самом деле почти у всех объектов нет суперкласса, только у классов есть суперклассы. –

+1

Да. Тогда как это сочетается с последним предложением ответа? –

0
Foo.superclass.superclass.superclass 

Эффективно ли вызов superclass метод fundamental object BasicObject.

BasicObject не имеет суперкласса, поэтому метод возвращает nil

nil является экземпляром NilClass, так что не класс сам по себе.

Если вы звоните nil.class.superclass, вы получаете Object

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