【问题标题】:handy ways to show linearization of a class?显示类线性化的便捷方法?
【发布时间】:2013-03-25 19:51:47
【问题描述】:

我敢打赌,通过新的反射库和/或 repl 电源模式,有一些时髦的方法可以在 repl 中显示线性化。这些是什么?

在我的特殊情况下,我试图了解 ArrayBuffer 实例的线性化。
(我正在尝试创建一个类似的类,即 Buffer 和 IndexedSeqOptimized,并且我发现编译器抱怨重写方法 seq 具有不兼容的类型)

Scala 类的线性化规则在scala spec 5.1.2 节中描述。据我了解,方法覆盖按线性化顺序进行,初始化按反向线性化顺序进行。

【问题讨论】:

    标签: scala read-eval-print-loop


    【解决方案1】:

    Scala 反射 API 中的 TypeClassSymbol 上有一个方法 baseClasses,根据它的 scaladoc,它返回:

    这种类型的所有基类(包括它自己的typeSymbol)的逆线性化顺序的列表,从类本身开始,到Any类结束。

    这个怎么用?这是一个以反向线性化顺序打印scala.collection.immutable.List 的所有超类的示例:

    import scala.reflect.runtime.universe._
    val tpe = typeOf[scala.collection.immutable.List[_]]
    tpe.baseClasses foreach { s => println(s.fullName) }
    

    输出:

    scala.collection.immutable.List
    scala.collection.LinearSeqOptimized
    scala.Product
    scala.collection.immutable.LinearSeq
    scala.collection.LinearSeq
    scala.collection.LinearSeqLike
    scala.collection.immutable.Seq
    scala.collection.immutable.Iterable
    scala.collection.immutable.Traversable
    scala.Immutable
    scala.collection.AbstractSeq
    scala.collection.Seq
    scala.collection.SeqLike
    scala.collection.GenSeq
    scala.collection.GenSeqLike
    scala.PartialFunction
    scala.Function1
    scala.collection.AbstractIterable
    scala.collection.Iterable
    scala.collection.IterableLike
    scala.Equals
    scala.collection.GenIterable
    scala.collection.GenIterableLike
    scala.collection.AbstractTraversable
    scala.collection.Traversable
    scala.collection.GenTraversable
    scala.collection.generic.GenericTraversableTemplate
    scala.collection.TraversableLike
    scala.collection.GenTraversableLike
    scala.collection.Parallelizable
    scala.collection.TraversableOnce
    scala.collection.GenTraversableOnce
    scala.collection.generic.FilterMonadic
    scala.collection.generic.HasNewBuilder
    java.lang.Object
    scala.Any
    

    【讨论】:

    • 我认为文档是错误的。这是线性化顺序 - 没有颠倒。
    • 提交 PR #2320 以修复文档。
    • 请注意,您可以调用例如ru.typeOf[Integer].baseClasses 保存几行
    • 另外,我们应该为未来的读者注意如何获得单例类型。我认为这样做:ru.typeOf[List.type].baseClasses
    • @ghik 您会(审查并)进行这些编辑以造福未来的读者吗?那我就点接受吧!
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2019-01-03
    • 1970-01-01
    • 2021-08-09
    • 2015-06-03
    相关资源
    最近更新 更多