有人可以解释为什么这不符合我的预期吗?
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执行。
答案 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