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 下划线将val视为def_Scala_Lambda - Fatal编程技术网

Scala 下划线将val视为def

Scala 下划线将val视为def,scala,lambda,Scala,Lambda,我想我明白为什么会这样 def x() = 1 x _ // () => Int x() _ // error: _ must follow method; cannot follow Int x 将方法转换为函数,因此得到一个无参数函数x()没有意义,因为调用该方法会给您一个Int,而该Int不能转换为函数。但为什么会这样呢 val x = 1 x _ // () => Int val和无参数方法之间几乎没有区别,除了无参数方法在被调用之前不会计算值(并且会为每个附加调

我想我明白为什么会这样

def x() = 1
x _   // () => Int
x() _ // error: _ must follow method; cannot follow Int
x 
将方法转换为函数,因此得到一个无参数函数
x()
没有意义,因为调用该方法会给您一个Int,而该Int不能转换为函数。但为什么会这样呢

val x = 1
x _   // () => Int

val
和无参数方法之间几乎没有区别,除了无参数方法在被调用之前不会计算值(并且会为每个附加调用重新计算值)。下面的
val
的实际情况是,有一个私有字段与一个公共访问器方法一起声明,该方法返回该值

object Test {
    def method = 1
    val value = 1
}
汇编至:

object Test extends Object {
  def method(): Int = 1;
  private[this] val value: Int = _;
  <stable> <accessor> def value(): Int = Test.this.value;
  def <init>(): Test.type = {
    Test.super.<init>();
    Test.this.value = 1;
    ()
  }
}
对象测试扩展对象{
def method():Int=1;
private[this]val值:Int=\ux;
def value():Int=Test.this.value;
def():Test.type={
测试。超级。();
Test.this.value=1;
()
}
}
请注意这一行:

 <stable> <accessor> def value(): Int = Test.this.value;
def value():Int=Test.this.value;
例如,这允许您使用子类中的
val
覆盖超类中的
def
,因为它实际上覆盖了一个方法。由于实际生成了一个方法,因此允许您将
val
扩展为一个函数。

val和无参数方法之间没有什么区别,只是无参数方法在被调用之前不会计算值。此外,无参数方法将在每次调用时计算结果。