下划线将val视为def

时间:2016-12-14 15:39:38

标签: scala lambda

我想我明白为什么会发生这种情况

def x() = 1
x _   // () => Int
x() _ // error: _ must follow method; cannot follow Int

x _将方法转换为函数,因此您获得了无参数函数。 x() _没有任何意义,因为调用该方法会为您提供一个Int,它不能转换为函数。但那么为什么会这样呢?

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

1 个答案:

答案 0 :(得分:3)

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;
    ()
  }
}

注意这一行:

 <stable> <accessor> def value(): Int = Test.this.value;

例如,这允许您在子类中使用def覆盖超类中的val,因为它实际上 覆盖了一个方法。由于实际生成了一个方法,因此您可以将val扩展为函数。