Spec-Zone.ru › Scala 3.1

Класс scala.annotation.elidable

Объект-компаньон • Исходный код

final class elidable(val level: Int) extends ConstantAnnotation

Аннотация для методов, тела которых могут быть исключены из сгенерированного байткода компилятором.

Поведение зависит от передачи -Xelide-below <arg> в scalac. Вызовы методов, помеченных elidable (а также тело метода), будут пропущены в сгенерированном коде, если приоритет, заданный аннотацией, ниже приоритета, заданного в командной строке.

@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`
}
Супертипы
Тракт ConstantAnnotation
Тракт StaticAnnotation
Класс Annotation
Класс Object
Тракт Matchable
Класс Any

Конкретные поля

Исходный код
final val level: Int

© 2002-2022 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://scala-lang.org/api/3.1.1/scala/annotation/elidable.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API