如何产生多个值?

时间:2018-10-19 15:10:43

标签: scala pattern-matching option

我的理解力很强:

val ao = Option(1)
val bo = Option(2)
val (x,y) = for (a <- ao; b <- bo) yield (a+b, b+a*2)

但是,这不起作用。对于理解,返回Option[(Int,Int)],但不能分配给单独的x和y。

如果我这样做:

val Some((x,y)) = for ...

当产生None时会导致异常。

如何实现这一目标?我希望x和y为Option[Int]。我希望找到一种优雅的解决方案,而不必使用x._1x.getOrElsematch

2 个答案:

答案 0 :(得分:2)

应该是unzip,但不幸的是,unzip返回List,而不是Option。可能最短的解决方法是:

val pairOpt = for (a <- ao; b <- bo) yield (a+b, b+a*2)
val (x, y) = (pairOpt.map(_._1), pairOpt.map(_._2))

答案 1 :(得分:0)

模式匹配不是处理选项的最佳方法吗?

val res = for (a <- ao; b <- bo) yield (a+b, b+a*2)

val (x, y) = res match {
  case Some((x, y)) => (Some(x), Some(y))
  case None => (None, None)
}

为什么不将其视为“优雅”?