
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.6 关系和逻辑操作
可以用关系方法大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)比较数值类型的大小,返回Boolean的结果。除此之外,可以用一元的'!'操作符(方法名为unary_!)对Boolean值取反。例如:

逻辑方法,如逻辑与(&&和&)和逻辑或(||和|),以中缀表示法接收Boolean的操作元,交出Boolean的结果。例如:

就像在Java中一样,&&和||操作符是短路(short-circuit)的:基于这两个操作符构建出来的表达式,只会对结果有决定作用的部分进行求值。换句话说,&&和||表达式的右侧,在左侧已经确定了表达式结果的情况下,并不会被求值。例如,如果&&表达式的左侧经求值得到false,则整个表达式的结果只能是false,因此右侧不会被求值。同理,如果||表达式的左侧经求值得到true,则整个表达式的结果只能是true,因此右侧也不会被求值。

在第一个表达式中,pepper和salt都被调用了,但在第二个表达式中,只有salt被调用。由于salt返回false,因此没有调用pepper的必要。
如果无论什么情况都对右侧求值,则可以使用&和|。&方法执行逻辑与操作,|方法执行逻辑或操作,但不会像&&和||那样短路。举例如下:

注意
你可能会好奇,既然操作符只是方法,那么短路是如何做到的。通常,所有入参都会在进入方法之前被求值,所以作为方法,逻辑操作符是如何做到不对第二个参数求值的呢?答案是所有Scala方法都有一个机制用来延迟对入参的求值,或者干脆不对入参求值。这个机制叫作传名参数(by-name parameter),在9.5节会有详细介绍。