用LessThan / GreaterThan / Equal对象替换普通compareTo int

时间:2013-12-09 13:53:46

标签: scala

我正在学习Scala。由于我不想使用Int作为比较结果(例如Ordered.compareTo),我试图想出一种替换它的方法。这就是我想出的:

sealed trait ComparisonResult

case object LessThan extends ComparisonResult
case object GreaterThan extends ComparisonResult
case object Equal extends ComparisonResult

object ComparisonImplicits {
  implicit def Int2ComparisonResult(value: Int) = value match {
    case v if v < 0 => LessThan
    case v if v > 0 => GreaterThan
    case _ => Equal
  }
}

然后我可以写像

这样的东西
val comparison: ComparisonResult = a compareTo b
comparison match {
  case LessThan => ...
  case GreaterThan => ...
  case Equal => ...
}

不幸的是,我必须将Int存储在类型为val的{​​{1}}中才能生效。例如。 ComparisonResult不起作用。

有更好或更惯用的方法吗?

2 个答案:

答案 0 :(得分:0)

使用您的代码无法解决这个问题。编译器无法推断应在此位置应用隐式转换,因为Int返回的compareTo为任何类型定义==。如果没有丢失方法,编译器将不会搜索隐式转换。

你能做什么呢?

implicit class ComparableInt(val i: Int) extends AnyVal{
  def isLessThan(other: Int) = i < other
  def isGreaterThan(other: Int) = i > other
}

if( 3 isLessThan 4) ":D" else ":("  

答案 1 :(得分:0)

Senia评论中的答案,即使用scalaz似乎是最好的答案。

Scalaz允许使用a |?| b进行比较,并将结果与​​例如Ordering.LT

此外,它定义了运算符,以便您可以编写if (a lt b) ...