用法 一
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。