【问题标题】:Missing parameter type for expanded function in Scala ArrayBufferScala ArrayBuffer 中的扩展函数缺少参数类型
【发布时间】:2012-04-24 21:27:21
【问题描述】:

在尝试从Scala for the impatient 运行以下 sn-p 时:

val b = ArrayBuffer(1,7,2,9)
val bSorted = b.sorted(_ < _)

我收到以下错误:

 error: missing parameter type for expanded function ((x$1, x$2) => x$1.$less(x$2))
       val bSorted = b.sorted(_ < _)

有人能解释一下这里可能发生了什么吗?参数类型不应该从 ArrayBuffer 的内容中推断出来还是需要显式指定?

谢谢

【问题讨论】:

    标签: scala sorting types parameters


    【解决方案1】:

    .sorted 采用 Ordering 类型的隐式参数(类似于 Java Comparator)。对于整数,编译器将为您提供正确的实例:

    scala> b.sorted
    res0: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 7, 9)
    

    如果要传递比较函数,请使用sortWith

    scala> b.sortWith( _ < _ )
    res2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 7, 9)
    
    scala> b.sortWith( _ > _ )
    res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(9, 7, 2, 1)
    

    但是,请注意,虽然ArrayBuffer 是可变的,但两种排序方法都会返回一个已排序的副本,但不会触及原始的。

    【讨论】:

    • 那么这是否意味着这本书有错误?还是 sorted 在某个时候采用了比较功能?
    • 我认为这是书中的错误。也许是不同的 Scala 版本?
    • 不是不同的 Scala 版本,不。 Sorted 是从一开始就使用该语法引入的——iirc,直到 2.7.x,它是 sort,而不是 sorted
    • @sc_ray 报错,列在the errata
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多