Scala - 明确说明定义 && 和 || 时的短路职能

Scala - Explicitly stating the short circuiting in defining && and || functions

在 Boolean (here) 的 Scala 源代码中,据说函数 && 和 ||无法使用 => 语法定义。

// Compiler won't build with these seemingly more accurate signatures
// def ||(x: => Boolean): Boolean
// def &&(x: => Boolean): Boolean

但我看不出这些定义有任何问题!

源码说不会而不是不能,可能是你理解错了。

如果你看到 Boolean.scala 的第 56 行,你会发现 || 的一些解释。

This method uses 'short-circuit' evaluation and behaves as if it was declared as def ||(x: => Boolean): Boolean. If a evaluates to true, true is returned without evaluating b.

源代码中的 && 相同。 综上所述,可以这样定义,但不需要,因为短路。

从语言用户的角度来看,这些定义非常好。

然而编译器很难在内部处理它们。一个名字参数被转换为一个匿名函数 class 扩展 scala.Function0[Boolean],这基本上意味着条件

left() || right()

将转换为

left() || (new Function0[Boolean] {
  def apply(): Boolean = right()
})

现在,当生成字节码时,编译器将很难以 left() || right() 预期的效率返回一些合理的东西。

因此,因为这是语言中的原始操作,使用原始类型Boolean,编译器允许自己作弊,并要求right() 不是别名。它因此看到了原始代码,并且可以轻松地将其转换为类似

的东西
if (left()) true else right()

相同
left() || right()

所以,基本上,这是一个实现 detail/shortcut。