我是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"
}
}
答案 0 :(得分:2)
for-expression是一系列map
,flatMap
和withFilter
调用的语法糖。您的特定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"
}