当前位置: 首页 > 知识库问答 >
问题:

Scala值定义:def和val计算的混乱情况

阎作人
2023-03-14

我引用马丁·奥德斯基的话:

  • def表单是“按名称”的,每次使用时都会对其右手边进行评估。
  • val定义的右侧是在定义本身处计算的。
    null
    null

我有点困惑为什么:

  • val x=loop//未被计算为false?

共有1个答案

施念
2023-03-14

如果使用

val y: Boolean = y

在方法体中的语句位置,它根本不计算任何值,因为它会产生编译时错误:

error: forward reference extends over definition of value y

但是,如果将其用作成员变量,则它将编译为一个单独的私有变量,该变量用_、getterdef和一个单独的初始值设定项初始化:

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();
  ()
}
def loop: Boolean = loop
val x = loop

下面是类似问题的另一个答案(同样,defval)。

 类似资料:
  • 不重复: 此问题不是链接问题的重复。尽管它询问了使用def和val定义函数之间的区别,但代码示例清楚地表明asker对Scala中方法和函数之间的区别感到困惑。该示例根本没有使用def来定义函数。-7小时前的Aaron Novstrup

  • 我正在学习和在,,部分,它说 统一访问原则只是Scala对待字段和方法比Java更统一的一个方面。另一个区别是在Scala中,字段和方法属于同一个命名空间。这使得字段可以覆盖无参数方法。例如,您可以将类ArrayElement中内容的实现从方法更改为字段,而无需修改类Element中内容的抽象方法定义,如清单10.4所示: 我基于示例的代码是 带def 我明白了 在ArrayElement中将de

  • 在Kotlin中,< code>var是可变的,而< code>val只能赋值一次。 但是,请考虑以下示例中的< code>val foo: 每次尝试访问,都会执行方法,从而产生不同的val值。 由于< code>foo的值在变化,所以我尝试使用< code>var。然后编译器抱怨“属性必须初始化”。所以我必须给它一个默认值: 这两种方法我都不喜欢。正确的做法是什么?

  • 我浏览了有效的scala幻灯片,在幻灯片10中提到,不要在抽象成员的中使用,而是使用。幻灯片没有详细提到为什么在中使用抽象是反模式。如果有人能解释在抽象方法的特征中使用val vs def的最佳实践,我将不胜感激

  • 问题内容: 我想知道的区别,而当我宣布一个功能。def和其他之间的区别或多或少很明显。而且我还看到,有时在声明()中添加了返回类型,有时则没有。 我还想知道如何在cython中声明一个字符串变量,因为我不知道,我将其声明为对象。 问题答案: 在Python中声明一个函数。由于Cython基于C运行时,因此您可以使用和。 在C语言层中声明函数。如您所知(或不?),您必须使用C语言定义每个函数的返回值

  • 正确性-类定义了一个不等于计算值的计算serialVersionUID 这个serializable类定义了一个serialVersionUID,它似乎是一个计算值,但是该值与计算值不匹配,因此失去了作为版本指示符的值。或者创建一个自定义值,如1、2、3、4。。等等,或者使用IDE重新计算serialVersionUID。 可能是指领域: 为什么18234907734L无效?