Scala-明确说明定义和&;和| |函数
在Boolean()的Scala源代码中,据说不能使用=>语法定义函数&&和| |Scala-明确说明定义和&;和| |函数,scala,short-circuiting,Scala,Short Circuiting,在Boolean()的Scala源代码中,据说不能使用=>语法定义函数&&和| | // Compiler won't build with these seemingly more accurate signatures // def ||(x: => Boolean): Boolean // def &&(x: => Boolean): Boolean 但我看不出这些定义有任何问题 源代码说它不会,而不是不能,可能是您错误地解释了它 如果您看到Boolean.s
// Compiler won't build with these seemingly more accurate signatures
// def ||(x: => Boolean): Boolean
// def &&(x: => Boolean): Boolean
但我看不出这些定义有任何问题 源代码说它不会,而不是不能,可能是您错误地解释了它 如果您看到Boolean.scala的第56行,您将找到对| |的一些解释 此方法使用“短路”评估和 其行为就像它被声明为
def | |(x:=>Boolean):Boolean
。
如果a
的计算结果为true
,则返回true
,而不计算b
与源代码中的&&相同。
总而言之,它可以这样定义,但因为短路,没有必要这样定义。从语言用户的角度来看,这些定义非常好 但是,编译器很难在内部处理它们。按名称参数被转换为一个匿名函数类,该类扩展了
scala.Function0[Boolean]
,这基本上意味着
left() || right()
将转变为
left() || (new Function0[Boolean] {
def apply(): Boolean = right()
})
现在,当发出字节码时,编译器很难以left()| | right()
所期望的效率发回合理的信息
因此,因为这是语言中的一个基本操作,使用基本类型Boolean
,编译器允许自己作弊,并要求right()
不要按名称排序。因此,它可以看到原始代码,并可以轻松地将其转换为
if (left()) true else right()
这和
left() || right()
因此,基本上,这是一个实现细节/快捷方式。谢谢,我实际上认为这是说不可能这样定义它。谢谢您的详细解释。所以基本上是某种短路,只能由编译器程序员使用!