Как сопоставить шаблон на необязательных аргументах Scala Scopt

У меня есть простой парсер Scops, который выглядит как

val parser: scopt.OptionParser[Config] = new scopt.OptionParser[Config]("my-app") {
  head("scopt", "3.x")
  (...)

  opt[String]('q', "query")
    .text("The query.")
    .action { (value, conf) => conf.copy(
      query = value
    )}
    .optional
}
(...)
parser.parse(args, Config()) match {
  case Some(config) => drive(config)
(...)

В моей функции драйвера я хочу инициализировать параметр тем, что предоставил пользователь через аргумент или каким-либо другим значением по умолчанию.

Я мог бы сделать что-то вроде

var myQuery = _
if config.query != "" myQuery = config.query
else myQuery = config.query

Но, (i) я сомневаюсь, что тестирование с пустой строкой - это правильный способ проверить, предоставил ли пользователь необязательный аргумент или нет, и (ii) это не выглядит очень функциональным для написания этого в Scala.

Вопрос: Есть ли хороший функциональный способ сделать это? Я рассмотрел сопоставление с образцом, как показано ниже, но аргументы Scopt, похоже, не возвращаются как Option[String]

val myQuery: String = config.query match {
  case Some(q) => q
  case None => "This is the default query"
}

1 ответ

Решение

Просто сделай Config#query Option[String]None по умолчанию) и измените query = value линия к query = Some(value),

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