Класс newMain.newMain
Аннотация, которая обозначает главную функцию. Главные функции являются точками входа для программ Scala. Их можно вызвать через командную строку, используя команду scala, после чего следует их имя и, необязательно, их параметры.
Параметры главной функции могут иметь любой тип T, при условии, что в области видимости существует given util.CommandLineParser.FromString[T] для парсинга строки, введенной в качестве входных данных, в правильный тип аргумента. Для этих типов уже определены парсеры:
- String,
- Boolean,
- Byte, Short, Int, Long, Float, Double.
Параметры главной функции могут передаваться либо по позиции, либо по имени. Передача аргумента по позиции означает, что вы передаёте аргументы в том же порядке, что и в сигнатуре функции. Передача аргумента по имени означает, что вы указываете аргумент сразу после его имени. Рассмотрим функцию @newMain def foo(i: Int, str: String), у которой аргументы могут быть переданы:
- по позиции:
scala foo 1 abc, - по имени:
scala foo -i 1 --str abcилиscala foo --str abc -i 1.
Возможна также смесь обоих способов: scala foo --str abc 1 эквивалентно всем предыдущим примерам.
Обратите внимание, что перегрузка функций main в настоящее время не поддерживается, т.е. вы не можете определить две главные функции с одинаковыми именами в одном проекте.
Используются специальные аргументы для отображения справки по главной функции: --help и -h. Если они используются в качестве аргументов, программа отобразит полезную информацию о главной функции. Эта справка напрямую использует комментарий ScalaDoc, связанный с функцией, точнее её описание и описание параметров, документированные с помощью @param. Обратите внимание, что если параметр называется help или h, или если у одного из параметров есть псевдоним, совпадающий с одним из этих имён, отображение справки по этому аргументу будет отключено. Например, для @newMain def foo(help: Boolean), scala foo -h будет отображать справку, но scala foo --help не сработает, так как он ожидает значение Boolean после --help.
Параметры могут быть снабжены аннотациями для добавления функциональности к главной функции:
-
main.aliasдобавляет другие имена параметру. Например, если параметрnodeимеет псевдонимыotherNodeиn, к нему можно обратиться, используя--node,--otherNodeили-n.
Вот пример главной функции с аннотированными параметрами: @newMain def foo(@newMain.alias("x") number: Int, @newMain.alias("explanation") s: String). Следующие команды эквивалентны:
scala foo --number 1 -s abcscala foo -x 1 -s abcscala foo --number 1 --explanation abcscala foo -x 1 --explanation abc
Булевы параметры рассматриваются как флаги, для которых не требуется передавать значение «true» или «false». Например, @newMain def foo(i: Boolean) может быть вызван как foo (где i=false) или foo -i (где i=true).
Специальный маркер -- может быть использован для указания, что все последующие аргументы передаются дословно как позиционные параметры. Например, @newMain def foo(args: String*) может быть вызван как scala foo a b -- -c -d, что подразумевает args=Seq("a", "b", "-c", "-d").
| Суперобъекты |
|---|
Конкретные методы
Исходный код
def argGetter[T](param: Parameter, arg: String, defaultArgument: Option[() => T])(using p: FromString[T]): () => T
Получатель idx-го аргумента типа T
| Параметры-значения |
|
|---|
Исходный код
Обработка аргументов команды перед их парсингом.
Возвращает Some последовательности аргументов, которые будут обработаны для передачи в главную функцию. Эта последовательность должна иметь такую же длину, как и количество параметров главной функции (т.е. info.parameters.size). Если есть параметр varargs, то последовательность должна быть длиной не менее 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/newMain.html