Scala中的&&和||运算符

18

由于像+、::、->等常规运算符都是可以重载的方法,因此我想知道||和&&是否也是方法。如果这些是布尔对象中的方法,理论上它们就可以起作用。 但如果它们确实是方法,那么为什么会出现这样的情况?

if (foo == bar && buz == fol)

可能吗?如果编译器从右往左读取,这将在bar上调用&&而不是(foo == bar)


== 显然比 && 有更高的优先级。 - Fred Foo
优先级是如何定义的呢?这只存在于编译器中还是有一些规则来确定哪些运算符首先被调用? - mice
编译器决定。 - Fred Foo
3
现在您应该询问一个普通函数如何具有与其他类C语言中的&&相同的短路评估语义。 - Ben Jackson
3
在Scala中执行短路评估非常容易。只需通过名称传递第二个参数,并在仅当第一个参数为false时才对其进行评估。 - Frank
3个回答

30
6.12.3 中缀操作 中缀操作符可以是任意标识符。中缀操作符具有以下定义的优先级和结合性: 中缀操作符的优先级由操作符的第一个字符确定。字符按优先级递增的顺序列在下面,同一行上的字符具有相同的优先级。
- (所有字母) - | - ^ - & - <> - = ! - : - + - - * / % - (所有其他特殊字符)
也就是说,以字母开头的运算符具有最低的优先级,其次是以 '|' 开头的运算符等等。 这个规则有一个例外,涉及赋值运算符(§6.12.4)。赋值运算符的优先级与简单赋值运算符 (=) 相同。也就是说,它比任何其他运算符的优先级都低。 接下来是关于结合性的解释,以及如何在具有多个运算符的表达式中组合所有内容。Scala参考 是很好的阅读材料。

22

0

这两个方法肯定是Scala中的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接