Использование метода «help» в неизменяемом SCOPT (Scala) OptionParser (2.0.1) - PullRequest
2 голосов
/ 27 марта 2012

Я пытаюсь использовать новую неизменяемую OptionParser в библиотеке Scala scopt 2.0.1.Поскольку OptionParser принимает универсальный тип, а метод справки уже определяет действие, которое возвращает 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 Ответ

2 голосов
/ 27 марта 2012

Прежде всего, в библиотеке, похоже, произошла ошибка, когда один из перегруженных методов 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 })
...