當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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