【问题标题】:Scala RedBlackTree syntaxScala RedBlackTree 语法
【发布时间】:2013-01-14 07:01:44
【问题描述】:

我在查看RedBlackTree 文件的源代码时偶然发现了Tree 的定义,我在此处复制了其中的相关部分:

sealed abstract class Tree[A, +B](
@(inline @getter) final val key: A,
@(inline @getter) final val value: B,
@(inline @getter) final val left: Tree[A, B],
@(inline @getter) final val right: Tree[A, B])

我有两个问题:

  1. @(inline @getter)@inline @getter 相比如何?
  2. 为什么vals 用final 限定? (final 在这种情况下不是多余的吗?)

【问题讨论】:

    标签: scala scala-collections scala-2.10


    【解决方案1】:

    @(inline @getter) 语法是元注释的示例,它告诉编译器应该将 @inline 注释放在生成的 getter 方法上(而不是构造函数参数,这将是这里的默认值): meta annotations

    final 将生成的字段和 getter 标记为 final,因此它们不能被子类覆盖。

    这里使用这种特殊组合来欺骗 Scala 编译器直接访问 Tree 实例的字段,而不是调用 getter 并依赖 JVM 优化器来执行正确的内联。不幸的是,Scala 没有提供官方支持的直接使用字段的方式。

    当红黑树针对 Scala 2.10 进行优化时,它提供了最佳性能。有关血腥细节,请参阅不可变 TreeMap/TreeSet pull request

    【讨论】:

    • 我已经阅读了一些拉取请求,但我之前从未注意到上面的内容,感谢您弹出来解释它!
    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 2012-06-04
    • 2012-05-12
    • 2012-04-05
    • 2014-05-10
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多