1

有人可以解释为什么这不能按我的预期工作吗?

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

示例执行:

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

ut 添加:'秒'。

ut 添加:'秒'。

ut 添加:'秒'。

ut 添加:'分钟'。

它在第一次循环中通过 ifTrue 继续执行。

4

3 回答 3

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

于 2013-06-11T05:18:46.777 回答
2

在 true 和 false 块中的语句周围放置括号。

于 2013-06-11T02:52:18.680 回答
2

一旦你掌握了关键字语法,我建议研究/模仿at:ifAbsent:字典中的消息,可以这样使用:

myUnits at: rhsKey put: (myUnits at: rhsKey ifAbsent: [0]) + 1  
于 2013-06-11T08:21:27.793 回答