在布尔(here)的Scala源代码中,据说功能&&和||无法使用=>定义语法。
// Compiler won't build with these seemingly more accurate signatures
// def ||(x: => Boolean): Boolean
// def &&(x: => Boolean): Boolean
但我无法看到这些定义有任何问题!
答案 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
。
同样适用于&&在源代码中。 总而言之,它可以像这样定义,但不需要因为短路。