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

感谢。

有帮助吗?

解决方案

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

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

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

其他提示

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

Squeak 的表现更符合您的预期:

inheritsFrom: aClass 

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

链接文字

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top