![Scala编程(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/446/43738446/b_43738446.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.6 关系和逻辑操作
可以用关系方法大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)比较数值类型的大小,返回Boolean的结果。除此之外,可以用一元的'!'操作符(方法名为unary_!)对Boolean值取反。例如:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-114-3.jpg?sign=1739015558-iHWUEg3TZajkF2vPyTNq4yj506CBq32v-0-0a05de9c690ea672364880af0f1f5711)
逻辑方法,如逻辑与(&&和&)和逻辑或(||和|),以中缀表示法接收Boolean的操作元,交出Boolean的结果。例如:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-114-4.jpg?sign=1739015558-MqTwjveb2mlxJ7iS0Exw1PPQ7Z7fDZjZ-0-2a1122ac53a6514f4f4d1d574009ca23)
就像在Java中一样,&&和||操作符是短路(short-circuit)的:基于这两个操作符构建出来的表达式,只会对结果有决定作用的部分进行求值。换句话说,&&和||表达式的右侧,在左侧已经确定了表达式结果的情况下,并不会被求值。例如,如果&&表达式的左侧经求值得到false,则整个表达式的结果只能是false,因此右侧不会被求值。同理,如果||表达式的左侧经求值得到true,则整个表达式的结果只能是true,因此右侧也不会被求值。
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-115-2.jpg?sign=1739015558-mLcNq7EiLKT2jssHzwCNDC8zg8DHry6g-0-b334186eeeef25fbef0377e4d29869e8)
在第一个表达式中,pepper和salt都被调用了,但在第二个表达式中,只有salt被调用。由于salt返回false,因此没有调用pepper的必要。
如果无论什么情况都对右侧求值,则可以使用&和|。&方法执行逻辑与操作,|方法执行逻辑或操作,但不会像&&和||那样短路。举例如下:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-115-3.jpg?sign=1739015558-EjNsKK73w55ZBrx7SF76mpvzhvn8ChvJ-0-44998acffb27703097af1c6318fe30e6)
注意
你可能会好奇,既然操作符只是方法,那么短路是如何做到的。通常,所有入参都会在进入方法之前被求值,所以作为方法,逻辑操作符是如何做到不对第二个参数求值的呢?答案是所有Scala方法都有一个机制用来延迟对入参的求值,或者干脆不对入参求值。这个机制叫作传名参数(by-name parameter),在9.5节会有详细介绍。