a > b
ifTrue:[ 'greater' ]
ifFalse:[ 'less or equal' ]
Run Code Online (Sandbox Code Playgroud)
我的理解是,布尔a> b接收消息ifTrue:['greater'],然后ifFalse:['less or equal']符合泛化:
objectInstance selector; selector2
Run Code Online (Sandbox Code Playgroud)
但是需要一个分号来指定selector2的接收者不是(objectInstance选择器)而是objectInstance.与上述条件执行不一样吗?
Jör*_*tag 19
方法的选择器是Boolean>>ifTrue:ifFalse:,这意味着它是一个具有两个参数的方法,而不是两个具有一个参数的方法.
因此,要调用该方法,请ifTrue:ifFalse:使用两个块参数向其发送消息.
请注意,为方便起见,还有方法Boolean>>ifFalse:ifTrue:,Boolean>>ifTrue:和Boolean>>ifFalse:.
相关的一切都已经说过了,但只是为了你的娱乐:
如前所述,
rcvr ifTrue:[...] ifFalse:[...]
Run Code Online (Sandbox Code Playgroud)
是一个单一的消息#' ifTrue:ifFalse: '将2个args发送给rcvr.该表达式的值是该消息发送的值.相反:
rcvr ifTrue:[...]; ifFalse:[...]
Run Code Online (Sandbox Code Playgroud)
是一个由2个连续消息组成的级联(#' ifTrue: '和#' ifFalse: '),每个消息都有1个arg发送给rcvr.表达式的值是从上次发送返回的值.
现在有趣的是,布尔人确实理解ifTrue:/ifFalse :(每个都有1个arg),所以你的代码适用于副作用(评估那些块),但不适用于它的值.这意味着:
a > b ifTrue:[Transcript showCR:'gt'] ; ifFalse:[Transcript showCR:'le']
Run Code Online (Sandbox Code Playgroud)
生成相同的输出:
a > b ifTrue:[Transcript showCR:'gt'] ifFalse:[Transcript showCR:'le']
Run Code Online (Sandbox Code Playgroud)
但:
msg := a > b ifTrue:['gt'] ; ifFalse:['le']
Run Code Online (Sandbox Code Playgroud)
将在msg中生成不同的值:
msg := a > b ifTrue:['gt'] ifFalse:['le']
Run Code Online (Sandbox Code Playgroud)
取决于a和b的值.尝试(ab)=(1 2)vs.(ab)=(2 1)...
许多Smalltalk初学者的问题是他们认为ifXXX:作为语法,它实际上是一个产生价值的消息发送.此外,半数不是许多以前学过的语言中的语句分隔符,而是序列消息发送构造.
对于初学者来说是一个糟糕的陷阱,因为代码似乎适用于某些特定的值组合,而它会为其他人生成有趣的结果.让我们希望您的单元测试涵盖这些;-)
编辑:要查看错误值的来源,请查看布尔>> ifFalse:方法为真正的接收器返回的内容...