2

私はsmalltalkメソッドを持っています:

isInvalid
    |tmp|
    tmp := super isInvalid.
    tmp ifTrue: [^ True].
    ^ instanceVar isNil.

例外が発生しています: Unhandled exception: NonBoolean receiver--proceed for truthtemp への割り当てでスローされます。がブールオブジェクトを返すと確信しているsuper isInvalidので、この例外の意味を誤解していると思います。他に知っている人はいますか?

4

1 に答える 1

6

ずっと前に、Smalltalkでフルタイムで働いていました。それが生きているのを見て良かった...

コードに次のエラーが表示されます。

  • 戻り値として値を使用しますTrue。これは(Smalltalkでは)値のみのクラスですtrue
  • true代わりに、SmalltalkのVMからの(私が思うに)事前定義されたオブジェクトの1つであるtrue、、、falseの値を使用する必要がありますnil
  • さらに良い解決策は次のとおりです。

    ^ super isInvalid or: [instanceVar isNil]
    

    これにより、本文またはメッセージがブール式に置き換えられます(これは常に、trueまたはfalseエラーの可能性はありません)。(正しい方法を教えてくれたFabianに感謝しますor:。)

したがって、正しい戻り値を使用すると、エラーメッセージが消えます。

ちなみに、エラーメッセージUnhandled exception: NonBoolean receiver--proceed for truthはある種のデバッグヘルプであり、続行できるので、より速く開発することができます...他の言語でそれを二度と見たことはありません...

于 2013-03-01T17:16:53.483 に答える