为什么例如对象inheritsFrom:fooobaar在Smalltalk中返回true?

时间:2009-03-09 10:13:15

标签: inheritance gnu smalltalk

似乎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是否ifTrue:[^ true]是罪魁祸首,但我正在寻找一个合理的理由,就像它以这种方式编码一样。 (顺便说一句,我是Smalltalk世界的新手,并且正在努力学习。)

感谢。

2 个答案:

答案 0 :(得分:3)

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

所以你实际上是在做“Object inheritsFrom:nil”,这是真的。我不知道吱吱声是假的;实际上,这将偏离蓝皮书。

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

答案 1 :(得分:2)

我认为我认为所有类引用都必须暗示某种类,所以nil引用意味着Object,它是所有东西的超类。

Squeak按照您期望的方式做得更多:

inheritsFrom: aClass 

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

link text