Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Smalltalk 为什么Ifrue和IfValse没有被分隔开;在闲聊中?_Smalltalk - Fatal编程技术网

Smalltalk 为什么Ifrue和IfValse没有被分隔开;在闲聊中?

Smalltalk 为什么Ifrue和IfValse没有被分隔开;在闲聊中?,smalltalk,Smalltalk,我的理解是,布尔a>b收到消息ifTrue:['greater'],然后ifFalse:['less or equal']符合一般化: a > b ifTrue:[ 'greater' ] ifFalse:[ 'less or equal' ] 但是需要一个分号来指定selector2的接收者不是(objectInstance selector),而是objectInstance。与上面的条件执行不一样吗?方法的选择器是Boolean>>ifTrue:ifFalse:,这意味着它是一个具

我的理解是,布尔a>b收到消息ifTrue:['greater'],然后ifFalse:['less or equal']符合一般化:

a > b
ifTrue:[ 'greater' ]
ifFalse:[ 'less or equal' ]

但是需要一个分号来指定selector2的接收者不是(objectInstance selector),而是objectInstance。与上面的条件执行不一样吗?

方法的选择器是
Boolean>>ifTrue:ifFalse:
,这意味着它是一个具有两个参数的方法,而不是两个具有一个参数的方法

因此,要调用该方法,需要向其发送带有两个块参数的消息
ifTrue:ifFalse:


请注意,出于方便的原因,还有一些方法
Boolean>>ifFalse:ifTrue:
Boolean>>ifTrue:
Boolean>>ifFalse:
所有相关的内容都已经说过了,但只是为了娱乐:

如前所述

objectInstance selector; selector2
是一条单独的消息#“ifTrue:ifFalse:”,带有2个参数发送到rcvr。该表达式的值是来自该消息发送的值。 相比之下:

rcvr ifTrue:[...] ifFalse:[...]
是两条连续消息的级联(#'ifTrue:'和#'ifFalse:'),每条消息都有一个参数发送到rcvr。表达式的值是上次发送时返回的值

现在有趣的是,布尔人确实理解ifTrue:/IFALSE:(每个都有一个arg), 因此,您的代码只针对副作用(评估这些块),而不针对其值。 这意味着:

rcvr ifTrue:[...]; ifFalse:[...]
生成与以下内容相同的输出:

a > b ifTrue:[Transcript showCR:'gt'] ; ifFalse:[Transcript showCR:'le']
但是:

将在msg中生成不同的值,而不是:

取决于a和b的值。试试(ab)=(12)对(ab)=(21)

许多Smalltalk初学者的问题是,他们认为ifXXX:是一种语法,实际上是一种产生价值的消息发送。此外,semi不像以前学习的许多语言那样是一个语句分隔符,而是一个顺序消息发送构造

对于初学者来说,这是一个糟糕的陷阱,因为代码似乎适用于某些特定的值组合,而它却为其他值组合生成有趣的结果。 希望您的单元测试能够涵盖这些;-)


编辑:要查看坏值来自何处,请查看布尔值>>ifFalse:method for a true receiver…

为了完整性起见;用于级联-发送到同一对象的消息序列。富吧;巴兹。与foo-bar的意思相同。你的理解是错误的;它不是“接收……然后……”,而是“接收一条信息”。见下面我的回答。
a > b ifTrue:[Transcript showCR:'gt'] ifFalse:[Transcript showCR:'le']
msg := a > b ifTrue:['gt'] ; ifFalse:['le']
msg := a > b ifTrue:['gt'] ifFalse:['le']