gpt4 book ai didi

scala - 从同伴导入的类不能用作构造函数参数默认值

转载 作者:行者123 更新时间:2023-12-04 12:45:52 25 4
gpt4 key购买 nike

考虑以下代码:

object Main extends App {
object Project {
case class Config(rules: Seq[String] = Seq.empty)
}

import Project._

//case class Project(root: String, config: Config) // compiles fine

//case class Project(root: String, config: Project.Config = Project.Config()) // compiles fine

case class Project(root: String, config: Config = Config()) // error: not found: type Config

}

为什么最后一个版本不能编译(与 Config = Config.apply() 相同)?

最佳答案

我不清楚这是否是一个错误,但这就是它产生错误的原因:

考虑这个,它有效:

import Project._

object Project {
case class Config()
}

case class Project(config: Config = Config())

当您添加默认参数时,编译器会生成一个方法来计算该值。当该值是构造函数默认值时,该方法将添加到类的伴随对象中。所以编译器会生成这个方法:
def <init>$default$1: Project.Config = Config() 

这将被添加到您的 Project目的。

Scala 类型检查器生成 Contexts 的对象树.每个上下文都有对其外部范围的上下文的引用。所以生成的方法获得一个上下文,生成的方法的外部作用域是 Project伴侣对象。

当类型检查器尝试解析 Config() 时它遍历所有封闭的上下文并且找不到 Config (我不确定为什么,这可能是一个错误)。

一旦它用尽了上下文,它就会解析具有 import Project._ 的导入。 !类型检查器很高兴,因为它现在可以遍历导入并找到 apply 方法。

现在,当您将导入移动到 Project 下方时:
object Project {
case class Config()
}

import Project._

case class Project(config: Config = Config())

在这种情况下,可用于生成方法的导入没有 Project._导入(这也可能是一个错误),我假设是因为它位于生成方法所在的对象定义之下。然后类型检查器抛出一个错误,因为它找不到 Config .

似乎正在发生的事情是类型检查器正在解析 Config()它需要在 Project 之上的导入伴随对象,因为它需要处理导入才能解析它,除非导入高于 Project该导入不在范围内。

对于那些希望进一步调试的人,请查看 Contexts.lookupSymbol 这是查找发生的地方

关于scala - 从同伴导入的类不能用作构造函数参数默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293812/

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