Особенность 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()*))
}
}
| Параметры значения |
|
|---|---|
| Супертипы | |
| Известные подтипы |
Абстрактные методы
Исходный код
Получатель idx-го аргумента типа T
| Параметры значения |
|
|---|
Исходный код
Обрабатывает аргументы командной строки перед их разбором.
Возвращает Some последовательности аргументов, которые будут обработаны и переданы в метод main. Эта последовательность должна иметь такую же длину, как количество параметров метода main (т.е. info.parameters.size). Если есть параметр varags, то последовательность должна иметь длину не менее info.parameters.size - 1.
Возвращает None если аргументы неверны и разбор и выполнение должны быть остановлены.
| Параметры значения |
|
|---|
Исходный код
Выполнить program если все аргументы корректны
| Параметры значения |
|
|---|
Исходный код
Получатель конечного аргумента 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