Scala Tuple选项

时间:2017-04-23 16:38:49

标签: scala tuples option

如果我有喜欢的Scala元组选项:

(Some(1), None)
(None, Some(1))
(None, None) 

我希望总是提取“Some”值(如果存在),否则得到None。模式匹配的唯一方法是什么?

3 个答案:

答案 0 :(得分:10)

有这个:

def oneOf[A](tup: (Option[A], Option[A])) = tup._1.orElse(tup._2)

这将返回已定义的第一个选项,如果两者都不是,则返回None。

修改

另一种表达相同内容的方法是

def oneOf[A](tup:  (Option[A], Option[A])) = 
   tup match { case (first, second) => first.orElse(second) }

它更长,但可能更具可读性。

答案 1 :(得分:4)

这应该有效:

def f(t: (Option[Int], Option[Int])): Option[Int] = t match {
  case (Some(n), _) => Some(n)
  case (_, Some(n)) => Some(n)
  case _ => None
}

答案 2 :(得分:2)

  

我希望始终提取Some值(如果存在),否则获取None

您可以使用orElse

def orOption[T](p: (Option[T], Option[T])): Option[T] = {
  val (o1, o2) = p
  o1 orElse o2
}

但是,如果存在两个Some值,则会确定该怎么做:

scala> orOption((Some(1), Some(2)))
res0: Option[Int] = Some(1)

您应该使用模式匹配,然后决定在有两个Some值时要执行的操作,例如抛出异常。或者,考虑对结果类型使用比Option更好的编码。