Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-明确说明定义和&;和| |函数_Scala_Short Circuiting - Fatal编程技术网

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

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

// 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()

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

谢谢,我实际上认为这是说不可能这样定义它。谢谢您的详细解释。所以基本上是某种短路,只能由编译器程序员使用!