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
}
Другие вопросы по тегам