You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:45:03