Использование метода "help" в неизменяемом SCOPT (Scala) OptionParser (2.0.1)

Я пытаюсь использовать новый неизменный OptionParser в библиотеке Scala Scopt 2.0.1. поскольку OptionParser принимает универсальный тип, а метод help уже определяет действие, которое возвращает Unit, Я получаю ошибку во время компиляции:

case class Config(directory: String = null)

val parser = new OptionParser[Config]() {
  def options = Seq(
    opt("d", "directory", "directory containing the files to be processed") {
      (value: String,  config: Config) => config.copy(directory = value)
    },
    help("?", "help", "Show a usage message and exit"))
}

error: type mismatch;
[INFO]  found   : scopt.generic.FlagOptionDefinition[Nothing]
[INFO]  required: scopt.generic.OptionDefinition[Config]
[INFO] Note: Nothing <: Config, but class OptionDefinition is invariant in type C.

Как включить опцию "Помощь"?

1 ответ

Решение

Во-первых, кажется, что в библиотеке произошла ошибка, когда один из перегруженных методов opt принимает параметр типа C чего не должно быть - по крайней мере из того, что я могу сказать. Надо просто взять C из класса. Во всяком случае, хотя вы используете этот вызов, я думаю, что Scala по-прежнему правильно делает вывод, что это C такой же, как у класса C (Config).

Кажется, проблема в том, что help совершенно бесполезно - это дает вам FlagOptionDefinition[Nothing] потому что это action: => C реализация {this.showUsage; exit},

Я думаю, что OptionParser класс нуждается в исправлении...

Вы можете написать свой собственный help метод, который обеспечивает C параметр типа:

def help2(shortopt: String, longopt: String, description: String) =
  new FlagOptionDefinition[C](Some(shortopt), longopt, description, 
    { this.showUsage; exit })
Другие вопросы по тегам