Smalltalk中消息<code>&</code>与<code>and:</code>、<code>|</code>与<code>or:</code>的区别是什么
Smalltalk中
&/and:、|/or:消息的差异说明 这两组布尔操作消息的核心差异是短路求值支持度和参数形式不同,具体拆分如下:
逻辑与类:& 与 and:
&是普通二元消息,不支持短路求值:无论左侧布尔值是true还是false,左右两侧的表达式都会先完成求值,再执行逻辑与运算。
示例:(1 > 2) & (3 error: '该代码会被执行抛出错误'),哪怕左侧已经确定为false,右侧的错误抛出逻辑依然会触发。
适用场景:两侧都是无副作用的简单布尔值判断时使用,没有块调用开销,性能略高。and:是关键字消息,支持短路求值:只有当左侧布尔值为true时,才会执行参数块内的逻辑;如果左侧为false,直接返回false,完全不会碰参数块的内容。注意and:的参数必须是无参数的块(用[]包裹)。
示例:(1 > 2) and: [3 error: '该代码永远不会执行'],左侧为false时直接返回结果,不会触发错误。
适用场景:右侧运算有副作用、或者计算成本极高(比如数据库查询、大规模数值计算)时使用,避免无意义的性能浪费或错误执行。
逻辑或类:| 与 or:
逻辑或组的差异和逻辑与组完全对应:
|是普通二元消息,不支持短路求值:无论左侧布尔值是true还是false,左右两侧的表达式都会先完成求值,再执行逻辑或运算。
示例:(1 < 2) | (3 error: '该代码会被执行抛出错误'),哪怕左侧已经确定为true,右侧的错误抛出逻辑依然会触发。
适用场景:两侧都是无副作用的简单布尔值判断时使用。or:是关键字消息,支持短路求值:只有当左侧布尔值为false时,才会执行参数块内的逻辑;如果左侧为true,直接返回true,完全不会碰参数块的内容。注意or:的参数同样必须是无参数的块。
示例:(1 < 2) or: [3 error: '该代码永远不会执行'],左侧为true时直接返回结果,不会触发错误。
适用场景:右侧运算有副作用、计算成本高时使用。
常见新手误区
不要把and:/or:的参数写成普通表达式,比如错误写法(1 > 2) and: (3 > 4),这种写法下参数不是块,右侧表达式会在消息发送前就完成求值,完全失去短路求值的作用,必须用方括号把右侧逻辑包裹成块。
内容的提问来源于stack exchange,提问作者Sol
相关产品推荐
相关产品推荐

