Dotty/Scala 3 中的结构类型编译失败?
Structural types in Dotty/Scala 3 compiled failed?
我测试了以下结构类型的代码:
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 中一样工作。如果您想让事情像以前一样工作,您可以按照@Dmytro Mitin 的建议添加 import reflect.Selectable.{ given _ }
(和添加反射回来)。
您可以尝试在全球范围内进行,例如通过 exporting 它在您的包裹中,但您需要自行承担风险。
我测试了以下结构类型的代码:
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 中一样工作。如果您想让事情像以前一样工作,您可以按照@Dmytro Mitin 的建议添加 import reflect.Selectable.{ given _ }
(和添加反射回来)。
您可以尝试在全球范围内进行,例如通过 exporting 它在您的包裹中,但您需要自行承担风险。