Почему, например, Объект ObjectitsFrom: Fooobaar возвращает true в Smalltalk? - PullRequest
1 голос
/ 09 марта 2009

Похоже, что метод GNIT SmallFalk для метода положение GNits SmallTalk возвращает true для каждого неопределенного имени класса, отправленного ему в качестве параметра. Это может сделать программу очень трудной для отладки, ИМХО. Глядя на код для этого в классе Поведения, это выглядит так:

inheritsFrom: aClass [
"Returns true if aClass is a superclass of the receiver"

<category: 'testing the class hierarchy'>
| sc |
aClass isNil ifTrue: [^true].

sc := self.
[sc := sc superclass.
sc isNil] whileFalse: [sc == aClass ifTrue: [^true]].
^false
]

Строка aClass isNil ifTrue: [^ true] является виновником, но я ищу разумную причину того, как она была закодирована таким образом. (Кстати, я новичок в мире Smalltalk и пытаюсь учиться.)

Спасибо.

Ответы [ 2 ]

3 голосов
/ 12 марта 2009

Это относится не к исключениям, а к неопределенным переменным. В REPL GNU Smalltalk или, альтернативно, в Transcript или Workspace для графических сред все неопределенные переменные равны nil - например, в Ruby это не сильно отличается.

Таким образом, вы на самом деле делаете «Object наследует от: ноль», что верно. Я не знал, что это неверно в Squeak; на самом деле это был бы отход от Синей Книги.

В методе вы бы получили "переменную fooobaar undefined" во время компиляции.

2 голосов
/ 09 марта 2009

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

Squeak делает это больше, чем вы ожидаете:

inheritsFrom: aClass 

|aSuperclass |
aSuperclass := superclass.
[aSuperclass == nil]
    whileFalse: [aSuperclass == aClass
            ifTrue: [^ true].
        aSuperclass := aSuperclass superclass].
^ false

текст ссылки

...