因为我引用了Martin Odersky的话:
在这种情况下:
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?
答案 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
)。