Smalltalk ifFalse / ifTrue不起作用

时间:2013-06-11 02:45:55

标签: smalltalk

有人可以解释为什么这不符合我的预期吗?

add: rhsKey
myUnits includesKey: rhsKey
            ifTrue: myUnits put: (myUnits at: rhsKey) + 1 at: rhsKey 
            ifFalse: myUnits add: rhsKey -> 1.

执行示例:

  

ut:= UnitTracker命名为:'test'。

     

ut add:'秒'。

     

ut add:'秒'。

     

ut add:'秒'。

     

添加:'分钟'。

它在第一轮游戏中继续通过ifTrue执行。

3 个答案:

答案 0 :(得分:7)

ifTrue:ifFalse:接受块[ ]作为参数。 如果你没有封装你想要在一个块中运行true和false的代码,它将在调用ifTrue:ifFalse:之前执行。

您还需要在括号myUnits includesKey: rhsKey中包围( ),否则编译器会对您实际尝试发送的邮件感到困惑。

事实上,我很惊讶您没有获得该代码的DoesNotUnderstand异常,因为您已经有效地将includesKey:ifTrue:put:at:ifFalse:add:发送到了myUnits。

如您所希望的那样添加括号,它将如下所示:

add: rhsKey
  (myUnits includesKey: rhsKey)
        ifTrue: [ myUnits put: (myUnits at: rhsKey) + 1 at: rhsKey ]
        ifFalse: [ myUnits add: rhsKey -> 1. ]

现在ifTrue:ifFalse:被发送到myUnits includesKey: rhsKey

的结果

答案 1 :(得分:2)

在括号中加上括号。

答案 2 :(得分:2)

一旦你理解了关键字语法,我建议学习/模仿Dictionary中的at:ifAbsent:消息,可以像这样使用:

myUnits at: rhsKey put: (myUnits at: rhsKey ifAbsent: [0]) + 1