【问题标题】:Scala Value Definitions: Confusing case for def and val evaluationScala 值定义:def 和 val 评估的混淆案例
【发布时间】:2018-03-13 21:53:48
【问题描述】:

自从和我引用 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?

【问题讨论】:

  • 因为要评估loop 的值,您首先需要评估loop 的值。这是一个没有转义条件的递归调用
  • 问题的重点很奇怪。很明显,val x = loop 应该永远挂起。不太明显的是为什么val y: Boolean = y 会做任何事情。
  • 感谢 Andrey 重新表述我的问题。我认为这个问题的重点很奇怪,因为我不知道 def 和 val 的基本程序。

标签: scala functional-programming


【解决方案1】:

如果你使用

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)

【讨论】:

  • 感谢安德烈的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2018-08-15
  • 1970-01-01
  • 2013-11-05
  • 2011-05-25
  • 2018-07-26
相关资源
最近更新 更多