Scala 元组选项
Scala Tuple Option
如果我有类似的 Scala 元组选项:
(Some(1), None)
(None, Some(1))
(None, None)
而且我想总是提取 "Some" 值(如果存在),否则获取 None。模式匹配的唯一方法?
这应该有效:
def f(t: (Option[Int], Option[Int])): Option[Int] = t match {
case (Some(n), _) => Some(n)
case (_, Some(n)) => Some(n)
case _ => None
}
有这个:
def oneOf[A](tup: (Option[A], Option[A])) = tup._1.orElse(tup._2)
这将 return 定义的第一个选项,或者 None 如果两者都没有。
编辑:
表达相同事物的另一种方式是
def oneOf[A](tup: (Option[A], Option[A])) =
tup match { case (first, second) => first.orElse(second) }
它更长,但可能更具可读性。
I want always to extract always the Some
value if it exists, and otherwise get the 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
.
更好的编码
如果我有类似的 Scala 元组选项:
(Some(1), None)
(None, Some(1))
(None, None)
而且我想总是提取 "Some" 值(如果存在),否则获取 None。模式匹配的唯一方法?
这应该有效:
def f(t: (Option[Int], Option[Int])): Option[Int] = t match {
case (Some(n), _) => Some(n)
case (_, Some(n)) => Some(n)
case _ => None
}
有这个:
def oneOf[A](tup: (Option[A], Option[A])) = tup._1.orElse(tup._2)
这将 return 定义的第一个选项,或者 None 如果两者都没有。
编辑:
表达相同事物的另一种方式是
def oneOf[A](tup: (Option[A], Option[A])) =
tup match { case (first, second) => first.orElse(second) }
它更长,但可能更具可读性。
I want always to extract always the
Some
value if it exists, and otherwise get theNone
你可以直接使用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
.