我测试了以下结构类型的代码:
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 中使用结构类型?谢谢!
我测试了以下结构类型的代码:
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
trait。因此,您必须导入scala.reflect.Selectable.reflectiveSelectable
隐式转换以使其像在 Scala 2 中一样工作。如果您想让事情像在import reflect.Selectable.{ given _ }
@Dmytro Mitin 建议的那样添加之前(并添加反射)。
您可以尝试在全球范围内执行此操作,例如通过将其导出到您的包中,但这样做需要您自担风险。