在scala中为什么对yield返回选项而不是string

时间:2016-08-09 14:21:17

标签: scala

我是scala的新手我正在尝试理解/ yield并且不明白为什么以下代码返回的选项不是String

val opString: Option[String] = Option("test")
val optionStr : Option[String] = for {
  op <- opString
} yield {
  opString match {
    case Some(s) => s
    case _ => "error"
  }
}

3 个答案:

答案 0 :(得分:2)

for-expression是一系列mapflatMapwithFilter调用的语法糖。您的特定for-expression被翻译成如下:

opString.map(op => opString match {
    case Some(s) => s
    case _ => "error"
})

正如您所看到的,您的表达式只会覆盖opString,而不会以任何方式展开。

答案 1 :(得分:1)

for ... for yield表达式的Desugared表达式为:

val optionStr = opString.map {
  op => 
     opString match { 
       case Some(s) => s
       case _ => "error"
     }
}

opString匹配{...}的类型是String,因此将map(String =&gt; String)应用于Option [String]的结果类型是Option [String]

答案 2 :(得分:0)

您要找的是getOrElse

opString.getOrElse("error")

这相当于:

opString match {
  case Some(s) => s
  case _ => "error"
}