首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我要导入Ordering.Implicits?

为什么我要导入Ordering.Implicits?
EN

Stack Overflow用户
提问于 2019-06-25 09:41:39
回答 2查看 185关注 0票数 2

在下面的代码中,除非导入Ordering.Implicits,否则我会得到一个编译错误。为什么进口是必需的?有办法绕过吗?我是不是做了些离谱的事?

代码语言:javascript
复制
Error:(15, 38) value < is not a member of type parameter A
      case (ah :: as, bh :: _) if ah < bh => findOverlap(c, as, b)
代码语言:javascript
复制
  private def foo[A : Ordering](c: mutable.Set[A], a: Seq[A], b: Seq[A]): mutable.Set[A] =
    (a, b) match {
      case (ah :: _, bh :: _) if ah == bh => c + ah
      case (ah :: as, bh :: _) if ah < bh => foo(c, as, b)
      case (_, _ :: bs) => foo(c, a, bs)
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-25 09:52:42

<方法来自Ordering特性的内部类Ops。在Ordering中有一个隐式转换提供了它,但是仅仅有一个Ordering的隐式实例还不够。您可以显式导入它:

代码语言:javascript
复制
  val ordering = implicitly[Ordering[A]]
  import ordering.mkOrderingOps

...or您可以导入Ordering.Implicits,它包含一些处理Ordering的实用方法。其中之一是 in scope的隐式转换。

票数 6
EN

Stack Overflow用户

发布于 2019-06-25 09:51:22

需要导入Ordering.Implicits的原因是<>等布尔操作的使用。

通过导入它,您可以告诉编译器使用scala.math.Ordering.Ops

代码语言:javascript
复制
  class Ops(lhs: T) {
    def <(rhs: T) = lt(lhs, rhs)
    def <=(rhs: T) = lteq(lhs, rhs)
    def >(rhs: T) = gt(lhs, rhs)
    def >=(rhs: T) = gteq(lhs, rhs)
    def equiv(rhs: T) = Ordering.this.equiv(lhs, rhs)
    def max(rhs: T): T = Ordering.this.max(lhs, rhs)
    def min(rhs: T): T = Ordering.this.min(lhs, rhs)
  }

允许您在<类型上调用A

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56751081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档