Scala:我如何明确比较两个选项?

时间:2014-04-25 03:55:51

标签: scala option implicit

如果我有两个选项,例如

val a = Option(2)
val b = Option(1)

我可以写

List(a,b).sorted

并通过插入隐式排序来正确排序。如何获得对此订购的引用,以便我可以调用compare(a,b)并获得结果?我想要相当于

val comparison = a.compare(b)

除非a和b是Ordered的实例。

2 个答案:

答案 0 :(得分:14)

您可以直接询问隐含的排序:

Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> implicitly[Ordering[Option[Int]]]
res0: Ordering[Option[Int]] = scala.math.Ordering$$anon$3@501a9177

scala> res0.compare(Some(1), Some(3))
res1: Int = -1

答案 1 :(得分:4)

操纵选项的最佳方法是使用for表达式。

for (a1 <- a; b1 <- b) yield a1.compare(b1)  // Some(-1)

如果至少有一个数字为None,则结果为None

val x: Option[Int] = None
for (a1 <- a; b1 <- x) yield a1.compare(b1)  // None

比较功能可以定义为

def compare(a: Option[Int], b: Option[Int]) = {
  for (a1 <- a; b1 <- b) yield a1.compare(b1)
}.get

<强>更新

如果你想要Nones,你可以使用模式匹配:

def compare(a: Option[Int], b: Option[Int]) = (a, b) match {
  case (Some(a), Some(b)) => a.compare(b)
  case (None, None)       => 0
  case (None, _)          => -1  // None comes before
  case (_, None)          => 1
}

val list: List[Option[Int]] = List(List(Some(1), None, Some(4), Some(2), None))
val list2 = list.sortWith(compare(_, _) < 0)    
//  list2 = List(None, None, Some(1), Some(2), Some(4))