Scala - 明确说明定义&& amp;中的短路和||功能

时间:2015-07-23 15:10:54

标签: scala short-circuiting

在布尔(here)的Scala源代码中,据说功能&&和||无法使用=>定义语法。

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

但我无法看到这些定义有任何问题!

2 个答案:

答案 0 :(得分:4)

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

然而,编译器很难在内部处理它们。将by-name参数转换为扩展scala.Function0[Boolean]的匿名函数类,这基本上意味着条件

left() || right()

将转换为

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

现在,当发出字节码时,编译器很难以left() || right()的效率发回一些合理的东西。

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

的内容
if (left()) true else right()

相同
left() || right()

所以,基本上,这是一个实现细节/快捷方式。

答案 1 :(得分:2)

源代码说它不会胜过,也许你错误地解释了它。

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

的一些解释
  

此方法使用'短路'评估和   表现得好像它被声明为def ||(x: => Boolean): Boolean。   如果a评估为true,则会在未评估true的情况下返回b

同样适用于&&在源代码中。 总而言之,它可以像这样定义,但不需要因为短路。