gpt4 book ai didi

scala - 当 A 扩展 Ordered[A] 时,为子类 B < A 对 Array[B] 进行排序的优雅方式?

转载 作者:行者123 更新时间:2023-12-05 00:33:20 24 4
gpt4 key购买 nike

定义了扩展 Ordering[A] 的类 A 和 A 的子类 B 后,如何自动对 B 数组进行排序? Scala 编译器提示它“找不到参数 ord 的隐式值:Ordering[B]”。这是一个具体的 REPL 示例(Scala 2.8),其中 A = Score 和 B = CommentedScore:

class Score(val value: Double) extends Ordered[Score] {
def compare(that: Score) = value.compare(that.value)
}
defined class Score

trait Comment { def comment: String }
defined trait Comment

class CommentedScore(value: Double, val comment: String) extends Score(value) with Comment
defined class CommentedScore

val s = new CommentedScore(10,"great")
s: CommentedScore = CommentedScore@842f23

val t = new CommentedScore(0,"mediocre")
t: CommentedScore = CommentedScore@dc2bbe

val commentedScores = Array(s,t)
commentedScores: Array[CommentedScore] = Array(CommentedScore@b3f01d, CommentedScore@4f3c89)

util.Sorting.quickSort(commentedScores)
error: could not find implicit value for parameter ord: Ordering[CommentedScore]
util.Sorting.quickSort(commentedScores)
^

我如何解决这个问题(即,“免费”对 Array[B] = Array[CommentedScore] 进行排序,因为我知道如何对 Array[A] = Array[Score] 进行排序),以一种避免样板的优雅方式?

谢谢!

最佳答案

自己添加所需的隐式:

implicit val csOrd: Ordering[CommentedScore] = Ordering.by(_.value)

你可以把它放在 CommentedScore伴生对象,以便在使用现场没有样板。

编辑:如果您希望仅在继承树的顶部定义排序方法,您仍然需要提供 Ordering对于每个子类,但您可以定义 compare Ordering的方法在 Score 中的目的。 IE。
object Score {
implicit val ord: Ordering[Score] = Ordering.by(_.value)
}

object CommentedScore {
implicit val csOrd = new Ordering[CommentedScore] {
def compare(x: CommentedScore, y: CommentedScore) = Score.ord.compare(x, y)
}
}

如果您不想为每个子类重新定义它,您可以使用泛型方法来生成 Ordering :
object Score {
implicit def ord[T <: Score]: Ordering[T] = Ordering.by(_.value)
}

由于是 def,所以效率有点低。而不是 val ,它会创建一个新的 Ordering每次需要一个。然而,开销可能很小。另请注意, Ordered特质和 compare现在我们不需要方法了 Ordering s。

关于scala - 当 A 扩展 Ordered[A] 时,为子类 B < A 对 Array[B] 进行排序的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12171138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com