我需要定义一些case类,如下所示:
case class Gt(key: String, value: Any) extends Expression {
def evalute[V, E](f: String => Any) = {
def compare(v: Any): Boolean = {
v match {
case x: Number => x.doubleValue > value.asInstanceOf[Number].doubleValue
case x: Array[_] => x.forall(a => compare(a))
case x => x.toString > value.toString
}
}
compare(f(key))
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢重复> <> =和<=
我也试过这个:
trait Expression {
def evalute[V, E](f: String => Any) = true
def compare(v: Any, value: Any, cp: (Ordered[_], Ordered[_]) => Boolean): Boolean = {
v match {
case x: Number => cp(x.doubleValue, value.asInstanceOf[Number].doubleValue)
case x: Array[_] => x.forall(a => compare(a, value, cp))
case x => cp(x.toString, value.toString)
}
}
}
case class Gt(key: String, value: Any) extends Expression {
def evalute[V, E](f: String => Any) = {
compare(f(key), value, ((a, b) => a > b))
}
}
Run Code Online (Sandbox Code Playgroud)
但那不工作:(
error: could not find implicit value for parameter ord: scala.math.Ordering[scala.math.Ordered[_ >: _$1 with _$2]]
compare(f(key), value, ((a, b) => a > b))
Run Code Online (Sandbox Code Playgroud)
有没有办法将运算符作为scala中的函数传递?
(a, b) => a > b工作良好.你的问题与类型有关.
什么是V和E在evalute[V, E]应该是什么?
您将其(a, b) => a > b作为参数传递cp: (Ordered[_], Ordered[_]) => Boolean.所以你有a: Ordered[_]和b: Ordered[_].这是一样的a: Ordered[X] forSome {type X}和b: Ordered[Y] forSome {type Y}.有了这些类型,a > b没有意义.