2

我正在尝试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.

如何包含“帮助”选项?

4

1 回答 1

2

首先,库中似乎有一个错误,其中一个重载方法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 })
于 2012-03-27T18:23:09.750 回答