使用隐式当然很容易:
implicit def enrichOptionInt(self: Option[Int]) = new {
def <(i: Int) = self.exists(_ < i)
}
val test1 = x < 3 && o1 < 5 // True
或者,如果您希望它适用于任何类型的数字:
class EnrichedOptionNumeric[N: Numeric](self: Option[N]) {
def <(n: N) = self.exists(v => implicitly[Numeric[N]].lt(v, n))
}
implicit def enrichOptionNumeric[N: Numeric](self: Option[N]) = new EnrichedOptionNumeric(self)
val oD = Some(2.0)
val test1 = x < 3 && o1 < 5 // true
val testD = x < 3 && oD < 5.0 // true
编辑以在评论中回答问题:
如果您想支持相等,那么不幸的是,您不能使用该运算符,==
因为该运算符已经为Option
. 如果已经为类定义了方法(或运算符),则永远不会触发隐式,因为 Scala 仅在无法识别被调用的方法时才查找隐式。
但是,您可以简单地定义一个不同的符号来表示“选项等于”。例如,您可以使用===
. 为此,您只需将以下行添加到上述定义中EnrichedOptionNumeric
:
def ===(n: N) = self.exists(v => implicitly[Numeric[N]].equiv(v, n))
然后你可以这样做:
val testE = x < 3 && o1 === 1 // true