首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dotty/Scala 3编译的结构类型失败了吗?

Dotty/Scala 3编译的结构类型失败了吗?
EN

Stack Overflow用户
提问于 2020-06-03 07:30:22
回答 1查看 312关注 0票数 2

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

代码语言:javascript
复制
trait Data

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

    println(data.value)
  }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 09:44:50

据我所见:

  • 推断改变了,所以您必须显式地细化类型: val数据: Data { value: Int }= new { value: Int =1} 当您运行dotr并检查推断类型时,您可以清楚地看到它。
  • 要使用精化,您必须让编译器知道您不介意反射导入reflect.Selectable.reflectiveSelectable

把它放在一起:

代码语言:javascript
复制
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中,结构类型是使用动力学实现的,这需要在Selectable特性中进行混合。因此,您必须导入scala.reflect.Selectable.reflectiveSelectable隐式转换,以允许它像Scala 2中那样工作。如果您想让事情像以前一样工作,可以按照@Dmytro的建议添加import reflect.Selectable.{ given _ } (并添加反射回)。

您可以尝试在全球范围内这样做,例如,通过在您的包中出口它,但它您将承担您自己的风险。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62167454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档