Smalltalk ifFalse/ifTrue不起作用

MrD*_*Duk 1 smalltalk

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

add: rhsKey
myUnits includesKey: rhsKey
            ifTrue: myUnits put: (myUnits at: rhsKey) + 1 at: rhsKey 
            ifFalse: myUnits add: rhsKey -> 1.
Run Code Online (Sandbox Code Playgroud)

执行示例:

ut:= UnitTracker命名:'test'.

添加:'秒'.

添加:'秒'.

添加:'秒'.

添加:'分钟'.

它在第一轮中继续通过ifTrue执行.

Stu*_*ing 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. ]
Run Code Online (Sandbox Code Playgroud)

所以现在ifTrue:ifFalse:正被送到结果myUnits includesKey: rhsKey