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 でもそれほど違いはありません。

したがって、実際には「Object inheritsFrom: nil」を実行していますが、これは本当です。Squeak ではそれが誤りだとは知りませんでした。実際、それはブルーブックからの逸脱になります。

メソッドでは、「変数 fooobaar 未定義」のコンパイル時エラーが発生します。

于 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 に答える