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