在Scala的ArrayBuffer中,扩展函数缺少参数类型。

9

我将尝试运行以下来自Scala for the impatient的代码段:

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的内容中推断出来吗?还是我需要明确指定它?

谢谢

1个回答

16

.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在某个时候采用了比较函数? - sc_ray
我认为这是书中的错误。可能是不同的Scala版本引起的? - paradigmatic
不是不同的Scala版本。从一开始就使用了排序语法--如果我没记错,到2.7.x为止,它是sort而不是sorted - Daniel C. Sobral
3
这是一个错误,在勘误表中有列出。 - Patrick Brinich-Langlois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接