2013-03-01 22 views
2

我有一個Smalltalk的方法:Nonboolean接收器 - 繼續對真理

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

我得到一個異常:Unhandled exception: NonBoolean receiver--proceed for truth扔在分配溫度。我很肯定super isInvalid返回一個布爾對象,所以我認爲我誤解了這個異常的含義。其他人碰巧知道嗎?

回答

6

很久以前,一個在Smalltalk全職工作。我高興地看到,它是活的......

我看到你的代碼以下錯誤:

  • 你作爲一個返回值使用值True,這是(在Smalltalk)只值類true
  • 你必須改用值true這是從Smalltalk中的VM這是truefalsenil的(我認爲)預定義的對象之一。
  • 一個更好的解決辦法是:

    ^ super isInvalid or: [instanceVar isNil] 
    

    這將替換整個身體或你的消息,由布爾表達式(這是所有的時間truefalse,不可能有錯誤)。 (感謝對費邊正確的方法or:

因此,使用正確的返回值,錯誤信息將消失。

順便說一句,該錯誤信息Unhandled exception: NonBoolean receiver--proceed for truth是某種調試的幫助,它可以讓你繼續,讓你能夠發展得更快......永遠不會再看到任何其他語言...

+0

謝謝。今天早上我在Python中工作,布爾值是True和False。那樣做了。 – Daniel 2013-03-01 17:27:59

+5

mliebelt是正確的,但是,要反映您的示例(wrt惰性評估)的相同語義將是'^ super isInvalid或:[instanceVariable isNil]'('||'每次都評估這兩個值,'#or:'確實不) – Tobias 2013-03-02 11:10:32

+0

我不認爲這是真的。 2例:第一個:'super isInvalid == true' ==>通過返回nil跳出來,其餘的不再評價。第二個:'super isInvalid == false' ==>評估'instanceVar isNil'並返回結果。這正是'||'所做的。 – mliebelt 2013-03-03 11:34:36

相關問題