Scala编程(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.6 关系和逻辑操作

可以用关系方法大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)来比较数值类型的大小,返回Boolean的结果。除此之外,可以用一元的'!'操作符(方法unary_!)来对Boolean值取反。例如:

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

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

在第一个表达式中,peppersalt都被调用了,但在第二个表达式中,只有salt被调用。由于salt返回false,并没有调用pepper的必要。

如果不论什么情况都对右侧求值,可以使用&|&方法执行逻辑与操作,|方法执行逻辑或操作,但不会像&&||那样短路。举例如下:

注意

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