用法 一
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 annotation.ConstantAnnotation用法及代码示例
- Scala annotation.implicitNotFound用法及代码示例
- Scala annotation.showAsInfix用法及代码示例
- Scala annotation.nowarn用法及代码示例
- Scala annotation.implicitAmbiguous用法及代码示例
- Scala annotation.switch用法及代码示例
- Scala any.!=用法及代码示例
- Scala any.ToString用法及代码示例
- Scala any.==用法及代码示例
- Scala any.IsConst用法及代码示例
- Scala aggregate()用法及代码示例
- Scala Tabulate.sliding用法及代码示例
- Scala ArrayBuffer.inits用法及代码示例
- Scala long.BitwiseOr用法及代码示例
- Scala StringBuilder.partitionMap用法及代码示例
- Scala List distinct()用法及代码示例
- Scala DefaultMap.sizeIs用法及代码示例
- Scala StrictOptimizedIterableOps.sliding用法及代码示例
- Scala Searching.SearchResult用法及代码示例
- Scala ::.collectFirst用法及代码示例
- Scala TreeSet diff()用法及代码示例
- Scala Char getClass()用法及代码示例
- Scala int.Min用法及代码示例
- Scala IntMap.groupMap用法及代码示例
- Scala Map3.mkString用法及代码示例
注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 annotation.elidable。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。