Как вывести несколько значений? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть для понимания, как:

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.

Как сделатьдостичь этой цели?Я хочу, чтобы х и у были Option[Int].Я надеюсь найти элегантное решение, не используя как x._1 или x.getOrElse, или match

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Разве сопоставление с образцом не является лучшим способом обработки опций?

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)
}

Почему это не может считаться «элегантным»?

0 голосов
/ 19 октября 2018

Это должно быть 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))
...