无意中,我观察到了不对称。
我们有一个清单:
val li = List (Some (3), Some (2), None, Some (9))
li: List[Option[Int]] = List(Some(3), Some(2), None, Some(9))
scala> li.max
res54: Option[Int] = Some(9)
好的 - 有些(9)大于无。为什么?会议?没有转换为Null和Null自动装箱成0吗?
scala> li.min
res55: Option[Int] = None
看起来,好像这种印象是真的,但让我们引入一个负数:
scala> val li = List (Some (3), Some (-2), None, Some (9))
li: List[Option[Int]] = List(Some(3), Some(-2), None, Some(9))
scala> li.min
res52: Option[Int] = None
scala> li.max
res53: Option[Int] = Some(9)
这令人惊讶,至少对我而言。
是的,我知道,我做错了。正确的方法是首先压扁,一切都很好:
scala> li.flatten.min
res57: Int = -2
scala> val li = List (Some (3), Some (2), None, Some (9))
li: List[Option[Int]] = List(Some(3), Some(2), None, Some(9))
scala> li.flatten.min
res56: Int = 2
但我的问题仍然存在:
是否和一些(x)缺乏其他可比性,被视为对象,然后通过toString进行比较(' N'' S')?
答案 0 :(得分:9)
查看source:
trait OptionOrdering[T] extends Ordering[Option[T]] {
def optionOrdering: Ordering[T]
def compare(x: Option[T], y: Option[T]) = (x, y) match {
case (None, None) => 0
case (None, _) => -1
case (_, None) => 1
case (Some(x), Some(y)) => optionOrdering.compare(x, y)
}
}
implicit def Option[T](implicit ord: Ordering[T]): Ordering[Option[T]] =
new OptionOrdering[T] { val optionOrdering = ord }
Some(x)
始终视为大于None
。没有尝试将None
视为零或其他任何内容。因此,对于任何Option[A]
(假设所述集合包含A
),它始终是None
集合的最小值。没有不对称性,这只是惯例。我认为尝试将None
转换为任意数字进行比较并不合理,因此None
小于Some(x)
每个Ordering[Option[A]]
都有意义。否则,对于每个Ordering[A]
,您需要一个特殊的<<TreeviewSelect>>
来处理这些特殊情况,而不是上面的通用代码。