2013-03-01 26 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

相关问题