В Scala 3 я могу указать основной метод, который получает один параметр, например:
@main def main(mode: String): Unit = ???
Если я запущу его без указания аргумента, я получу сообщение «Недопустимая командная строка: ожидается больше аргументов». Отлично.
Теперь, если я укажу такое значение по умолчанию
@main def main(mode: String = "foo"): Unit = ???
тогда я все еще получаю ту же ошибку.
Пробовал со Scala 3.4.2.
Редактировать: отправлено https://github.com/scala/scala3/issues/20485
Вы пробовали использовать Option
из любопытства?
Анализ аргументов в @main
совершенно бесполезен. Единственное разумное, что вы можете сделать, — это получить старомодный массив String
, а затем самостоятельно проанализировать его с помощью какой-нибудь подходящей библиотеки. Невозможно спроектировать правильно функционирующий интерфейс, используя то, что предоставляет нынешний @main
, а жаль...
Я не думаю, что это описано где-либо в документации, кроме моих экспериментов: @main
предполагает, что у вас очень простой случай, когда фиксированное количество аргументов (необязательно с 1 переменным аргументом), достаточно всех примитивов. Для чего-то более гибкого (необязательные аргументы, значения по умолчанию, подкоманды) вам придется использовать внешнюю библиотеку. Я бы использовал его для PoC, чтобы протестировать самый простой вариант использования, а затем перейти к чему-то другому. Или для очень простых сценариев одноразового использования.
Параметры основного метода Scala 3 хороши только для очень простых случаев, примеров и тому подобного. Для любого реального использования обязательно используйте специальную библиотеку. Вероятно, существуют и другие, но самый известный из них — mainargs . Текущая реализация Scala 3 является подмножеством этой библиотеки. См. также Планируете использование @main и mainargs в Scala3? тема на scala-contributors:
План, после обсуждения в комитете SIP несколько месяцев назад, таков:
- В Scala 3.0.0 обеспечьте минимальную поддержку
@main
, то есть строгое подмножествоmainargs
, на основе которого комитет мог бы достичь консенсуса.- После версии 3.0.0 вернитесь к ней и обобщите ее, чтобы поддержать больше вариантов использования.
Возможно, ситуация изменится, аннотации макросов стабилизируются. См. этот пост в той же теме:
Я считаю, что текущий план состоит в том, чтобы создавать любые расширения поверх макроаннотаций, которые имеют экспериментальную реализацию.
Похоже, что механизм анализа аргументов, сгенерированный автоматически, не обрабатывает параметры по умолчанию. Вы можете открыть проблему. Или просто используйте подходящую библиотеку анализа аргументов напрямую, а не полагайтесь на магию компилятора.