我想我明白为什么会发生这种情况
def x() = 1
x _ // () => Int
x() _ // error: _ must follow method; cannot follow Int
x _
将方法转换为函数,因此您获得了无参数函数。 x() _
没有任何意义,因为调用该方法会为您提供一个Int,它不能转换为函数。但那么为什么会这样呢?
val x = 1
x _ // () => Int
答案 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
扩展为函数。