scala - 如何向 scala 集合对象添加采用隐式排序的方法

标签 scala implicit-conversion implicit enrich-my-library

我正在尝试将丰富我的库模式与具有隐式排序的 scala 集合方法结合使用。

给出这个定义:

object ImplicitTest {
  implicit def RichTraversableOnce[A](t: TraversableOnce[A]): RichTraversableOnce[A] =
    new RichTraversableOnce[A](t)

  class RichTraversableOnce[A](val t: TraversableOnce[A]) {
    def myMinBy[B >: A](f: A => B)(implicit cmp: Ordering[B]): A = {
      if (t.isEmpty)
        throw new UnsupportedOperationException("empty.myMinBy")

      t.reduceLeft((x, y) => if (cmp.lteq(f(x), f(y))) x else y)
    }
  }
}

这个测试是怎么来的:

 @Test
  def testOrdering {
    import ImplicitTest._
    val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).myMinBy(_.toDouble)

    // ...but this works:
    // val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).minBy(_.toDouble)

    println(mx)
  }

给我这个编译错误?

error: No implicit Ordering defined for AnyVal{def getClass(): java.lang.Class[_ >: Int with Double <: AnyVal]}. val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).myMinBy(_.toDouble)

最佳答案

myMinBy 中的 B >: A 没有任何理由。这就是 AnyVal 的来源,即 IntDouble 的最小上限。您的代码适用于 myMinBy[B](...)

关于scala - 如何向 scala 集合对象添加采用隐式排序的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240815/

相关文章:

scala - 什么是 "Call By Name"?

c# - 为什么我不能在C#中将字符串更改为数组

c++ - 隐式转换以适应现有构造函数

scala - 对隐式对象或值中的参数类型进行抽象?

Scala.js 无法在 fork 的 JVM 中运行

scala - 避免在 Spark 中使用 ReduceByKey 进行混洗

c++ - 将显式实例化的函数模板与转换相匹配

node.js - 如何使用 nodeJS 连接到隐式 FTPS 服务器?

c++ - 从 QString* 到 QString& 的转换

scala - Ga特林 - 在simulation.log或控制台中记录请求正文