Spec-Zone.ru › Scala 3.2

Особенность MainAnnotation.MainAnnotation

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

trait MainAnnotation[Parser[_], Result] extends StaticAnnotation

MainAnnotation предоставляет функциональность для компилятором генерируемого главного класса. Она связывает генерируемый компилятором метод main (назовем его compiler-main) с написанным пользователем методом main (user-main). Протокол вызовов из compiler-main следующий:

  • создание command с аргументами командной строки,
  • для каждого параметра user-main, вызов command.argGetter, или command.varargGetter если это конечный параметр varargs,
  • вызов command.run с замыканием user-main, примененным ко всем аргументам.

Пример:

/** Sum all the numbers
 *
 *  @param first Fist number to sum
 *  @param rest The rest of the numbers to sum
 */
@myMain def sum(first: Int, second: Int = 0, rest: Int*): Int = first + second + rest.sum

генерирует

object foo {
  def main(args: Array[String]): Unit = {
    val mainAnnot = new myMain()
    val info = new Info(
      name = "foo.main",
      documentation = "Sum all the numbers",
      parameters = Seq(
        new Parameter("first", "scala.Int", hasDefault=false, isVarargs=false, "Fist number to sum"),
        new Parameter("rest", "scala.Int" , hasDefault=false, isVarargs=true, "The rest of the numbers to sum")
      )
    )
    val mainArgsOpt = mainAnnot.command(info, args)
    if mainArgsOpt.isDefined then
      val mainArgs = mainArgsOpt.get
      val args0 = mainAnnot.argGetter[Int](info.parameters(0), mainArgs(0), None) // using parser Int
      val args1 = mainAnnot.argGetter[Int](info.parameters(1), mainArgs(1), Some(() => sum$default$1())) // using parser Int
      val args2 = mainAnnot.varargGetter[Int](info.parameters(2), mainArgs.drop(2)) // using parser Int
      mainAnnot.run(() => sum(args0(), args1(), args2()*))
  }
}
Параметры значения
Parser

Класс, используемый для разбора строки аргументов и преобразования аргументов в T

Result

Требуемый тип результата метода main. Если этот тип Any или Unit, будет принят любой тип.

Супертипы
trait StaticAnnotation
class Annotation
class Object
trait Matchable
class Any
Известные подтипы
class newMain

Абстрактные методы

Исходный код
def argGetter[T](param: Parameter, arg: String, defaultArgument: Option[() => T])(using Parser[T]): () => T

Получатель idx-го аргумента типа T

Параметры значения
defaultArgument

Необязательная лямбда для создания значения по умолчанию

индекс

Индекс аргумента

Исходный код
def command(info: Info, args: Seq[String]): Option[Seq[String]]

Обрабатывает аргументы командной строки перед их разбором.

Возвращает Some последовательности аргументов, которые будут обработаны и переданы в метод main. Эта последовательность должна иметь такую же длину, как количество параметров метода main (т.е. info.parameters.size). Если есть параметр varags, то последовательность должна иметь длину не менее info.parameters.size - 1.

Возвращает None если аргументы неверны и разбор и выполнение должны быть остановлены.

Параметры значения
args

Аргументы командной строки

info

Информация о команде (имя, документация и информация о параметрах)

Исходный код
def run(program: () => Result): Unit

Выполнить program если все аргументы корректны

Параметры значения
program

Функция, содержащая вызов метода main и инициализацию его аргументов

Исходный код
def varargGetter[T](param: Parameter, args: Seq[String])(using Parser[T]): () => Seq[T]

Получатель конечного аргумента varargs типа T*

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

Spec-Zone.ru

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