0

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

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

这是来自在这里找到的 scopt 库

理想情况下,我想要做的是将我的代码执行所有“在这里做的事情”到一个方法中,这个方法可以完成我想要它做的事情。

但是,当我像这样定义我的方法时:

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 返回一个选项,但是“map”在这里做什么?

4

1 回答 1

1

发生错误是因为Option需要类型参数,因此您的config参数setupVariables应该是 anOption[String]或 an Option[Config]

Option.map接受一个函数A => B并使用它来将 anOption[A]转换为Option[B]. 你可以改变你setupVariables的类型Config => Unit并且可以做

def setupVariables(config: Config) {
    ...
}

parser.parse(args, Config()).map(setupVariables)

创建一个Option[Unit].

但是,由于您只是setupVariables为了它的效果而执行,我建议通过匹配parser.parse例如的结果来更加明确

parser.parse(args, Config()) match {
    case Some(cfg): setupVariables(cfg)
    case _ => //parse failed
}
于 2013-07-29T17:34:14.670 回答