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

xia*_*982 2 scala dotty structural-typing scala-3

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

trait Data

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

    println(data.value)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*zok 5

就我所见:

把它放在一起:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

我想你必须这样做的原因是因为很多时候人们不想进行细化,一个人已经有了它(例如,测试所有测试装置new Fixture { ... }都是不必要的细化类型)。另一个是在访问改进时(在 Scala 2 中),改进使用反射,这会导致性能损失——所以这是我们应该有意识地而不是意外地做的事情。

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

您可以尝试在全球范围内执行此操作,例如通过导出到您的包中,但您需要自行承担风险。