Значения по умолчанию игнорируются в @main?

В Scala 3 я могу указать основной метод, который получает один параметр, например:

@main def main(mode: String): Unit = ???

Если я запущу его без указания аргумента, я получу сообщение «Недопустимая командная строка: ожидается больше аргументов». Отлично.

Теперь, если я укажу такое значение по умолчанию

@main def main(mode: String = "foo"): Unit = ???

тогда я все еще получаю ту же ошибку.

  1. Почему это?
  2. И почему компилятор не жалуется, если по умолчанию значения невозможны в аргументах основного метода? Просто игнорировать их мне не кажется полезным.

Пробовал со Scala 3.4.2.

Редактировать: отправлено https://github.com/scala/scala3/issues/20485

Похоже, что механизм анализа аргументов, сгенерированный автоматически, не обрабатывает параметры по умолчанию. Вы можете открыть проблему. Или просто используйте подходящую библиотеку анализа аргументов напрямую, а не полагайтесь на магию компилятора.

Luis Miguel Mejía Suárez 23.05.2024 19:12

Вы пробовали использовать Option из любопытства?

Gaël J 23.05.2024 19:35

Анализ аргументов в @main совершенно бесполезен. Единственное разумное, что вы можете сделать, — это получить старомодный массив String, а затем самостоятельно проанализировать его с помощью какой-нибудь подходящей библиотеки. Невозможно спроектировать правильно функционирующий интерфейс, используя то, что предоставляет нынешний @main, а жаль...

Andrey Tyukin 24.05.2024 15:01

Я не думаю, что это описано где-либо в документации, кроме моих экспериментов: @main предполагает, что у вас очень простой случай, когда фиксированное количество аргументов (необязательно с 1 переменным аргументом), достаточно всех примитивов. Для чего-то более гибкого (необязательные аргументы, значения по умолчанию, подкоманды) вам придется использовать внешнюю библиотеку. Я бы использовал его для PoC, чтобы протестировать самый простой вариант использования, а затем перейти к чему-то другому. Или для очень простых сценариев одноразового использования.

Mateusz Kubuszok 24.05.2024 21:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Параметры основного метода Scala 3 хороши только для очень простых случаев, примеров и тому подобного. Для любого реального использования обязательно используйте специальную библиотеку. Вероятно, существуют и другие, но самый известный из них — mainargs . Текущая реализация Scala 3 является подмножеством этой библиотеки. См. также Планируете использование @main и mainargs в Scala3? тема на scala-contributors:

План, после обсуждения в комитете SIP несколько месяцев назад, таков:

  1. В Scala 3.0.0 обеспечьте минимальную поддержку @main, то есть строгое подмножество mainargs, на основе которого комитет мог бы достичь консенсуса.
  2. После версии 3.0.0 вернитесь к ней и обобщите ее, чтобы поддержать больше вариантов использования.

Возможно, ситуация изменится, аннотации макросов стабилизируются. См. этот пост в той же теме:

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

Другие вопросы по теме