帮助隐含价值

Ale*_*sky 2 scala implicit

我有这段代码,它有效:

val directions = rs.map(_.direction) // Direction extends Enumeration
directions == directions.sorted.reverse
Run Code Online (Sandbox Code Playgroud)

我想改为做这样的事情:

ratings.map(_.direction).isInBackwardsOrder


class RichSeq[T](seq: Seq[T]) {
    def isInBackwardsOrder = seq == seq.sorted.reverse
}

object RichSeq {
    implicit def seq2richSeq[T](seq: Seq[T]) = new RichSeq[T](seq)
}
Run Code Online (Sandbox Code Playgroud)

我不断收到以下编译错误:

could not find implicit value for parameter ord: Ordering[T]
def isInBackwardsOrder = seq == seq.sorted.reverse
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它可以找到参数ord的隐含值,当它是原始形式时,但是一旦我将它拉入实用程序类就找不到它.

谢谢你的帮助,Alex

Did*_*ont 6

在原始形式中,您没有任何泛型.directionsSeq[SomeWellKnownType],在编译时,编译器查找Ordering[SomeWellKnownType]隐式作用域,并找到一个.

另一方面,在RichSeq[T]编译器中必须找到一个隐式Ordering[T]where T是一个类型参数.没办法那样做.您必须确保Ordering在创建时可用RichSeq:

class RichSeq[T](seq: Seq[T])(implicit ev: Ordering[T]) {...
Run Code Online (Sandbox Code Playgroud)

有一个快捷方式,特别是如果你只需要ev隐式范围而不明确地重新显示它,如下所示:

class RichSeq[T : Ordering](seq: Seq[T]) {...
Run Code Online (Sandbox Code Playgroud)

那么你在隐式方法中也有完全相同的问题,这也是通用的,使用相同的解决方案:

implicit def seq2richSeq[T: Ordering](seq: Seq[T]) = new RichSeq[T](seq)
Run Code Online (Sandbox Code Playgroud)

然后它应该工作.seq2richSeq当订单可用于Seq中元素的类型时,隐式转换将启动.