Scala值定义:def和val评估的情况令人困惑

时间:2018-03-13 00:29:06

标签: scala functional-programming

因为我引用了Martin Odersky的话:

  • def 表单是“按名称”,其右侧是每个 使用。
  • val 定义的右侧在此处进行评估 定义本身。

在这种情况下:

  • def loop: Boolean = loop
  • val x = loop // Leads to an infinite loop

在这种情况下:

  • val y: Boolean = y // Evaluated to false

我有点困惑为什么:

  • val x = loop // doesn't get evaluated to false?

1 个答案:

答案 0 :(得分:3)

如果您使用

val y: Boolean = y

在方法体内的语句位置,它根本不评估任何东西,因为它给出了编译时错误:

error: forward reference extends over definition of value y

但是,如果您将其用作成员变量,则会将其编译为使用_初始化的单独私有变量,getter def和单独的初始值设定项:

private[this] val y: Boolean = _;
<stable> <accessor> def y(): Boolean = XeqX.this.y;

[...]

def <init>(): WhateverYourClassIsCalled.type = {
  XeqX.super.<init>();
  XeqX.this.y = XeqX.this.y();
  ()
}

由于布尔值右侧的_评估为默认值false,因此当您在初始化程序中访问它时,成员y已设置为false

与此相反

def loop: Boolean = loop

一旦被召唤就永远不会终止。因此

val x = loop

尝试立即评估其右侧,然后永远挂起。

这是another answer for a similar problem (again, difference between def and val)