gpt4 book ai didi

scala - Dotty/Scala 3 中的结构类型编译失败?

转载 作者:行者123 更新时间:2023-12-02 02:49:54 25 4
gpt4 key购买 nike

我测试了以下结构类型的代码:

trait Data

object Main
{
def main(args: Array[String]): Unit =
{
val data = new Data {
val value: Int = 1
}

println(data.value)
}
}

它在 Scala 2.13.2 中编译成功,但在 Dotty/Scala3 中编译失败。如何在 Dotty/Scala3 中使用结构类型?谢谢!

最佳答案

据我所见:

  • 推论改变了,所以你必须明确地细化类型:
    val data: Data { val value: Int } = new Data {
    val value: Int = 1
    }
    运行dotr查看推断出的类型是什么
  • 就可以看得很清楚
  • 要使用优化,你必须让编译器知道你不介意反射
    import reflect.Selectable.reflectiveSelectable

综合:

import reflect.Selectable.reflectiveSelectable

trait Data

object Main
{
def main(args: Array[String]): Unit =
{
val data: Data { val value: Int } = new Data {
val value: Int = 1
}

println(data.value)
}
}

我想你必须这样做的原因是因为很多时候你不想进行细化,但已经进行了细化(例如测试所有测试装置 new Fixture { ... }是不必要的精炼类型)。另一个是改进在访问改进(在 Scala 2 中)时使用反射,这会导致性能下降 - 因此我们应该有意识地而不是无意地这样做。

在 Scala 3 中,结构类型是使用 dynamics 实现的,这需要混合 Selectable 特性。因此,您必须导入 scala.reflect.Selectable.reflectiveSelectable 隐式转换以允许它像在 Scala 2 中一样工作。如果您想让事情像之前一样工作,您可以添加 import reflect.Selectable.{ given _ } 按照@Dmytro Mitin 的建议(并添加反射)。

您可以尝试在全局范围内进行操作,例如通过 exporting它在您的包裹中,但您需要自行承担风险。

关于scala - Dotty/Scala 3 中的结构类型编译失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62167454/

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