Scala scopt代码 - map getorelse?

时间:2013-07-29 17:10:17

标签: scala scopt

我是scala的新手并且不明白这段代码在做什么:

parser.parse(args, Config()) map {
  config =>
    //do stuff here
} getOrElse {
  //handle stuff here
}

这来自scopt库found here

理想情况下,我想做的是将我所做的所有“在这里做的事情”的代码放入一个方法中,好吧,做我想做的事。

然而,当我像这样定义我的方法时:

def setupVariables(config: Option){
    host = config.host
    port = config.port
    delay = config.delay
    outFile = config.outFile

    if (!(new File(config.inputFile)).exists()) {
      throw new FileNotFoundException("file not found - does the file exist?")
    } else {
      inputFile = config.inputFile
    }
}

以便像这样调用它:

parser.parse(args, Config()) map {
  config =>
    setupVariables(config)
} getOrElse {
  //handle stuff here
}

我收到错误:error: class Option takes type parameters def setupVariables(config: Option){

我的困惑之所以产生,是因为我没有“得到”parser.parse(args, Config()) map { config => //do stuff here }正在做的事情。我可以看到parser.parse返回一个Option,但是这里做什么是“map”?

1 个答案:

答案 0 :(得分:1)

您发生错误是因为Option需要类型参数,因此config的{​​{1}}参数应为setupVariablesOption[String]

Option[Config]使用函数Option.map并使用它将A => B转换为Option[A]。您可以将Option[B]更改为类型setupVariables,然后可以

Config => Unit

创建def setupVariables(config: Config) { ... } parser.parse(args, Config()).map(setupVariables)

但是,由于您只是为其效果执行Option[Unit],我建议通过匹配setupVariables的结果来更明确。例如

parser.parse