Udy*_*Udy 5 inheritance scala optionparser scopt
我试图拥有一个带有一些默认参数的基本选项解析器。
在其他项目中,我想使用其他参数扩展选项解析器。
就像是:
case class Config(foo: String = null)
trait DefaultParser { self: OptionParser[Config] =>
opt[String]('f', "foo") action { (x, c) =>
c.copy(foo = x)
}
}
case class MyConfig(bar: String = "hello world")
trait MyParser { self: OptionParser[MyConfig] =>
opt[String]('b', "bar") action { (x, c) =>
c.copy(bar = x)
}
}
Run Code Online (Sandbox Code Playgroud)
我是新手Scala,我不确定现在如何在同一个args.
我正在使用Scala2.10 和scopt_2.10v3.3.0。
我已经打开https://github.com/scopt/scopt/issues/132。
到目前为止,我能想到的最好的办法就是组合两个解析器。
case class OutputOpts(
val outputOption: Int = 1
)
trait OptsWithOutput {
def output: OutputOpts
}
Run Code Online (Sandbox Code Playgroud)
这个解析器位于父类中。
def parseOutputOpts(args: Array[String]): OutputOpts = {
val parser = new scopt.OptionParser[OutputOpts]("scopt") {
override def errorOnUnknownArgument = false
opt[Int]("outputOption") action { (x, c) =>
c.copy(outputOption = x)
} text ("some output option")
}
parser.parse(args, OutputOpts())
.getOrElse(throw new Exception("Error parsing output cli args"))
}
Run Code Online (Sandbox Code Playgroud)
子类现在可以使用这个:
case class ChildOpts(
childThing: Int = 42,
output: OutputOpts = OutputOpts()
) extends OptsWithOutput
Run Code Online (Sandbox Code Playgroud)
它的解析器将两者结合起来。
val opts = ChildOpts(output = super.parseOutputOpts(args))
val parser = new scopt.OptionParser[ChildOpts]("scopt") {
override def errorOnUnknownArgument = false
opt[Int]("childThing") action { (x, c) =>
c.copy(childThing = x)
} text ("some child thing")
}
parser.parse(args, opts).getOrElse(throw new Exception("failed"))
Run Code Online (Sandbox Code Playgroud)
请注意我们如何设置errorOnUnknownArgument为false,这绝对不理想并会导致警告。