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。
在 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
. Ifa
evaluates totrue
,true
is returned without evaluatingb
.
源代码中的 && 相同。 综上所述,可以这样定义,但不需要,因为短路。
从语言用户的角度来看,这些定义非常好。
然而编译器很难在内部处理它们。一个名字参数被转换为一个匿名函数 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。