1

似乎 GNU Smalltalk 中的 inheritsFrom: 方法对于作为参数发送给它的每个未定义的类名都返回 true。恕我直言,这可能会使程序非常难以调试。查看 Behavior 类中的代码,它看起来像这样:

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 世界的新手,并且正在努力学习。)

谢谢。

4

2 回答 2

3

这与异常无关,而是与未定义的变量有关。在 GNU Smalltalk 的 REPL 中,或者在图形环境的 Transcript 或 Workspace 中,未定义的变量都是 nil ——例如,这在 Ruby 中并没有太大的不同。

所以你实际上是在做“对象继承自:nil”,这是真的。我不知道 Squeak 是假的。实际上,这将背离蓝皮书。

在一个方法中,您会得到一个“variable fooobaar undefined”编译时错误。

于 2009-03-12T16:35:12.280 回答
2

我想想法是所有类引用都必须暗示某种类,因此 nil 引用暗示 Object,它是所有事物的超类。

Squeak更符合您的预期:

inheritsFrom: aClass 

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

链接文本

于 2009-03-09T10:26:40.470 回答