【问题标题】:Extending Scopt OptionParser in Scala在 Scala 中扩展 Scopt OptionParser
【发布时间】:2015-12-01 17:57:04
【问题描述】:

我正在尝试使用带有一些默认参数的基本选项解析器。

在其他项目中,我想用其他参数扩展选项解析器。

类似:

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)
  }
}

我是Scala 的新手,我不确定现在如何在同一个args 上同时使用它们。

我正在使用Scala 2.10 和scopt_2.10 v3.3.0。

【问题讨论】:

    标签: scala inheritance optionparser scopt


    【解决方案1】:

    我打开了https://github.com/scopt/scopt/issues/132

    到目前为止,我能想到的最好的方法是结合两个解析器。

    case class OutputOpts(
      val outputOption: Int = 1
    )
    
    trait OptsWithOutput {
      def output: OutputOpts
    }
    

    解析器位于父类中。

    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"))
    }
    

    子类现在可以使用这个:

    case class ChildOpts(
      childThing: Int = 42,
      output: OutputOpts = OutputOpts()
    ) extends OptsWithOutput
    

    它的解析器将两者结合起来。

    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"))
    

    请注意我们必须如何将errorOnUnknownArgument 设置为false,这绝对不理想并会导致警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多