【问题标题】:What are the compiler generated implicit values in Scala 2.10?Scala 2.10 中编译器生成的隐含值是什么?
【发布时间】:2014-03-16 13:05:26
【问题描述】:

Scala reflection guide中是这样写的:

与清单一样,实际上可以要求编译器 生成一个 TypeTag。这是通过简单地指定一个隐式来完成的 TypeTag[T] 类型的证据参数。如果编译器找不到 在隐式搜索期间匹配隐式值,它会自动 生成一个 TypeTag[T]。

ThisStackOverflow 的回答很好地解释了“隐含证据”的概念。但是,我仍然不完全清楚 编译器将 生成一个 TypeTag[T]。

  • 这是否意味着这是“隐含证据”搜索的特例? IE。当编译器进行隐式搜索时,类 TypeTag[T] 以特殊方式处理?我试图在 Scala 反射 API 中查找隐式参数值,但没有找到提供 TypeTag[T] 的任何参数值,因此我假设 TypeTag[T] 隐式参数来自编译器内部(如文档所述)。所以类名 TypeTag[T] 被硬编码到编译器的源代码中。这个假设正确吗?

  • 是否在某处记录了隐式值的自动生成?换句话说,是否有一个文档列出了所有自动生成的隐含证据?我在Scala language specification(2.9 版)中没有找到 TypeTag[T]。与 TypeTag[T] 最接近的概念是 Manifest,它是自动生成的隐式参数。 Manifests 是 Scala 2.9 中唯一自动生成的隐式值参数吗?

【问题讨论】:

    标签: scala reflection implicit scala-2.10 scala-compiler


    【解决方案1】:

    是的,TypeTags 和 WeakTypeTags 被隐式搜索特别对待。现在 implicit macros 确实有效,我们计划删除这个硬代码,但这仍有待实施。

    到目前为止,除了源代码之外,还没有关于自动生成隐式值的文档,其中说当前只生成类型标签和清单:https://github.com/scala/scala/blob/38ee986bcad30a8835e8f197112afb5cce2b76c5/src/compiler/scala/tools/nsc/typechecker/Implicits.scala#L1288

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多