Scala scopt code - карта getorelse?
Я новичок в 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 возвращает Option, но что здесь делает "карта"?
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
}