当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Scala annotation.elidable用法及代码示例


用法 一

final class elidable(val level: Int) extends ConstantAnnotation

其主体可能从compiler-generated 字节码中排除的方法的注释。

-Xelide-below <arg> 传递给 scalac 会影响行为。如果给定注释的优先级低于命令行上给定的优先级,则对标记为可删除的方法(以及方法主体)的调用将从生成的代码中省略。

@elidable(123)           // annotation priority
scalac -Xelide-below 456 // command line priority

方法调用将被替换为取决于省略表达式的类型的表达式。按优先级降序排列:

Unit            ()
Boolean         false
T <: AnyVal     0
T >: Null       null
T >: Nothing    Predef.???

完整示例:

import scala.annotation._, elidable._
object Test extends App {
  def expensiveComputation(): Int = { Thread.sleep(1000) ; 172 }

  @elidable(WARNING) def warning(msg: String) = println(msg)
  @elidable(FINE) def debug(msg: String)      = println(msg)
  @elidable(FINE) def computedValue           = expensiveComputation()

  warning("Warning! Danger! Warning!")
  debug("Debug! Danger! Debug!")
  println("I computed a value: " + computedValue)
}
% scalac example.scala && scala Test
Warning! Danger! Warning!
Debug! Danger! Debug!
I computed a value: 172

// INFO lies between WARNING and FINE
% scalac -Xelide-below INFO example.scala && scala Test
Warning! Danger! Warning!
I computed a value: 0

请注意,只能将具体方法标记为 @elidable 。未注释的方法不会被省略,即使它覆盖/实现了具有注释的方法。

另请注意,静态类型确定考虑哪些注释:

import scala.annotation._, elidable._
class C { @elidable(0) def f(): Unit = ??? }
object O extends C { override def f(): Unit = println("O.f") }
object Test extends App {
  O.f()      // not elided
  (O: C).f() // elided if compiled with `-Xelide-below 1`
}

伴生:

object

源码:

elidable.scala

用法 二

object elidable

这个无用的出现代码对于允许人们将命名常量用于可删除注释是必要的。这就是说服编译器折叠常量所需要的:否则当需要检查省略级别时,它会盯着一棵树

(Select(Level, Select(FINEST, Apply(intValue, Nil))))

而不是数字 300

伴生:

class

源码:

elidable.scala

相关用法


注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 annotation.elidable。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。