我正在学习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
不起作用。
有更好或更惯用的方法吗?
答案 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) ...