我把一个假问题,来说明我的观点:说我们有以下几种实用的功能,以显示有关特定排序算法的信息:是否有可能使用高阶函数与可选参数
fun sort(name: String, array: Array<Int>, sortingAlgorithm: (Array<Int>) -> Array<Int>) {
println(name)
sortingAlgorithm(array).forEach { print(" $it ") }
println()
}
你会使用这样的:
sort("Selection Sort - Θ(n^2)", arrayOf(2, 3, 1), ::selectionSort)
而且这个工程,因为selectionSort
签名很简单:fun selectionSort(array: Array<Int>): Array<Int> {
但说我有以下签名
fun quickSort(array: Array<Int>,
start: Int = 0,
end: Int = array.size - 1): Array<Int> {
最后两个参数是可选的另一种排序算法,所以理论上你可以调用quickSort
你叫selectionSort
以同样的方式。也就是说,它尊重签名(Array<Int>) -> Array<Int>
对吗?
不幸的是,当我尝试打电话sort("Quick Sort", arrayOf(2, 3, 1), ::quickSort)
我得到:
我觉得编译器不是明智地意识到,这两个参数都是可选的。如何避免这个问题,除了重载sort
方法来接受带签名的高阶函数?
难道你不能只使用lambda表达式而不是方法引用? –
你的意思是这样的:sort(“Quick Sort”,{quickSort(unsorted)}),yes,that works!但我只是想知道为什么其他方式不行。它觉得它应该可以工作。 – feresr
大拇指寻找这样不切实际的问题:D – voddan