2013-07-29 107 views
0

我是新來的Scala和不明白這個代碼是這樣做的:斯卡拉scopt代碼 - 地圖getorelse?

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

你的錯誤,因爲Option需要一個類型參數,所以你config參數setupVariables應該是一個Option[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(例如,

parser.parse(args, Config()) match { 
    case Some(cfg): setupVariables(cfg) 
    case _ => //parse failed 
}