如何产生多个值?
How to yield multiple values?
我有这样的理解:
val ao = Option(1)
val bo = Option(2)
val (x,y) = for (a <- ao; b <- bo) yield (a+b, b+a*2)
但是这不起作用。为了理解 returns Option[(Int,Int)]
但不能分配给个体 x 和 y。
如果我这样做:
val Some((x,y)) = for ...
yield None时引发异常。
如何实现这个目标?我希望 x 和 y 为 Option[Int]
。我希望在不使用 x._1
或 x.getOrElse
或 match
的情况下找到一个优雅的解决方案
应该是unzip
,但不幸的是,unzip
returnsList
不是Option
]s。最短的解决方法可能是:
val pairOpt = for (a <- ao; b <- bo) yield (a+b, b+a*2)
val (x, y) = (pairOpt.map(_._1), pairOpt.map(_._2))
模式匹配不是处理选项的最佳方式吗?
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)
}
为什么不考虑 'elegant'?
我有这样的理解:
val ao = Option(1)
val bo = Option(2)
val (x,y) = for (a <- ao; b <- bo) yield (a+b, b+a*2)
但是这不起作用。为了理解 returns Option[(Int,Int)]
但不能分配给个体 x 和 y。
如果我这样做:
val Some((x,y)) = for ...
yield None时引发异常。
如何实现这个目标?我希望 x 和 y 为 Option[Int]
。我希望在不使用 x._1
或 x.getOrElse
或 match
应该是unzip
,但不幸的是,unzip
returnsList
不是Option
]s。最短的解决方法可能是:
val pairOpt = for (a <- ao; b <- bo) yield (a+b, b+a*2)
val (x, y) = (pairOpt.map(_._1), pairOpt.map(_._2))
模式匹配不是处理选项的最佳方式吗?
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)
}
为什么不考虑 'elegant'?