1

我想在scala中获得几个选项之一的值,如下所示:

def or(a:Option[Int], b:Option[Int]):Option[Int]=
    if (a.isDefined) a else b

val a= Option(1)
val b= Option(2)
or(a,b).get

但我想知道为什么没有||为 Option 定义运算符?有没有更惯用的方式来做到这一点?

4

3 回答 3

5

使用 orElse。

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

scala> (None: Option[Int]) orElse Some(2)
res1: Option[Int] = Some(2)
于 2013-11-15T16:03:18.810 回答
2

使用 Scalaz 7,您可以使用Tags.Firstmonoid:

[info] Starting scala interpreter...
[info] 
import scalaz._
import Scalaz._
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_51).
Type in expressions to have them evaluated.
Type :help for more information.

scala> Tags.First('a'.some) |+| Tags.First('b'.some)
res0: scalaz.@@[Option[Char],scalaz.Tags.First] = Some(a)

scala> Tags.First(none[Char]) |+| Tags.First('b'.some)
res1: scalaz.@@[Option[Char],scalaz.Tags.First] = Some(b)

scala> Tags.First('a'.some) |+| Tags.First(none[Char])
res2: scalaz.@@[Option[Char],scalaz.Tags.First] = Some(a)

请参阅作为 Monoid 的选项

于 2013-11-15T16:19:53.533 回答
1

使用orElse.

val a = None
val b = Some("b")

a orElse b

返回一些(“b”)

于 2013-11-15T16:03:02.260 回答