gpt4 book ai didi

scala - Scala 中 `def` 和 `val` 的不同类型推断

转载 作者:行者123 更新时间:2023-12-03 13:37:27 25 4
gpt4 key购买 nike

当应用于 def 时,我观察到 Scala 的类型推断有所不同。和 val .

使用 def ,我可以定义一个抽象的nullary方法const返回一些 Int => Int 类型的值.实现时const使用函数文字,我不需要提供参数类型,因为它可以由编译器推断:

trait D {
def const: Int => Int
}
object D extends D {
def const = i => i + 1
}

这可以。 (不利的一面是,每次访问 D.const 都会创建一个新函数实例。)

现在考虑使用 val 的类似结构。 :
trait V {
val const: Int => Int
}
object V extends V {
val const = i => i + 1
}

这将无法编译,失败
error: missing parameter type
val const = i => i + 1
^

为什么?

最佳答案

如果您使用选项 -Xprint all 构建此代码,您将看到:

abstract trait V extends scala.AnyRef {   
<stable> <accessor> def const: Int => Int
};

final object V extends java.lang.Object with V with ScalaObject {

def this(): object V = {
V.super.this();
()
};

private[this] val const: <error> => <error> = ((i: <error>) => i.+(1));
<stable> <accessor> def const: <error> => <error> = V.this.const
}

因此错误发生在创建私有(private) val 和访问器时。
在创建访问器 def const 之前,编译器尝试评估影响 val const 的值。

如果您查看 trait 中定义的 val const,您会看到私有(private) val 的创建被禁用,因为它只是 def const 访问器的定义。

我认为具有先前定义(在特征或父类(super class)中)的推理类型仅在他尝试创建访问器时发生,而不是用于评估值。

而对于最后一个 def const ,类型仅基于 private[this] val const type : error => error

关于scala - Scala 中 `def` 和 `val` 的不同类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com