Scala正在保存排序函数参数



我正在尝试保存用于在Scala中对序列进行排序的参数,以便以后延迟执行。

例如,我想保存(".value")排序函数,而不是"list.sortBy(.vvalue)",并在以后检索此排序函数("_.value")进行实际排序。

如何保存和检索用于延迟执行的排序函数参数?以下是一些测试代码示例:

class SortTest {
def testSort () = {
val myClass = new MyClass(0)
val list = List (myClass, new MyClass(1), new MyClass(2), new MyClass(3), new MyClass(4))
// Want to sort by value attribute, but don't want to sort right away.  Rather
// how do I save the sort function, and retrieve it at a later time for execution?
list.sortBy(_.value)
// save the sort function (i.e. sort by the value attribute of myClass)
// something similar to the following syntax
myClass.setSortFunction (_.value)
// retrieve the sort function and sort the list
list.sortBy(myClass.getSortFunction())          
}
class MyClass (d:Int){
val value = d
val sortFunc = null
// what should be the signature of this function ?
def setSortFunction (sortFunc: ()) = {
this.sortFunc = sortFunc
}
// what should be the return type of this function?
def getSortFunction () = {
return sortFunc
}
}
}

您可以这样做:

val sortFunction = (x : { def value: Int } ) => x.value

在这一点上,您可能对Int的硬编码不满意。不幸的是,函数必须具有定义良好的类型,因此我无法在返回类型上使其通用。

相反,可以将其定义为:

def sortFunction[T] = (x : { def value: T } ) => x.value

但是,不能传递定义,只能传递值,并且不能参数化值。

另一方面,你用错误的方式处理这个问题——有一种假设,sortBy将函数作为参数,而只是这样。不正确:sortBy采用两个参数:一个函数和一个Ordering。如果您不保存订单,则无法对其进行排序。

现在我们来谈谈另一个问题。。。函数必须具有类型MyClass => T,并且排序必须为类型Ordering[T]。如果事先不知道T是什么,就无法保存。

幸运的是,Ordering之所以是一个好主意,您可以简单地创建一个Ordering[MyClass]并使用它!

方法如下:

class MyClass(d: Int) {
val value = d
private var sortFunction: Ordering[MyClass] = _
def setSortFunction[T : Ordering](f: MyClass => T) {
sortFunction = Ordering by f
}
def getSortFunction = sortFunction
}

你这样使用它:

list.sorted(myClass.getSortFunction)

请注意,它使用的不是sortBy,而是sorted。方法sortBy是通过创建一个Ordering并用它调用sorted来实现的,因此不会损失任何性能。

最新更新