扩展和高阶函数引用

时间:2018-03-05 11:22:04

标签: kotlin kotlin-extension

我总体上了解了这些是什么,我编写了一段代码但是我不太明白它为什么会起作用。
事情是callExtensionOnString期望扩展函数作为参数但是,如果通过printString的引用,则不会抱怨。 String.() -> Unit只是(String) -> Unit类型的另一个名称,还是Kotlin编译器采用某种快捷方式来扩展函数中的更高顺序?

fun main(args: Array<String>) {
    callExtensionOnString(::printString)
}

fun callExtensionOnString(extensionFun: String.() -> Unit) {
    "testString".extensionFun()
}

fun printString(str: String) {
    println(str)
}

然后还有第二件事我似乎不清楚。 printString引用一次传递到callExtensionOnString,然后传递到run函数,基本上需要String.() -> Unit扩展功能。这两者之间是否存在差异,以便省略第二次::前缀?

fun main(args: Array<String>) {
    runFunctionOnString(::printString)
}

fun runFunctionOnString(higherOrderFun: (String) -> Unit) {
    "testString".run(higherOrderFun)
}

fun printString(str: String) {
    println(str)
}

1 个答案:

答案 0 :(得分:2)

关于你的第一个问题,这两个是等价的:

"testString".extensionFun()
extensionFun("testString")

这就是为什么传递printString方法不会导致编译错误。

关于第二个问题,区别在于highOrderFun已经是对函数的引用,而printString不是函数引用(但您可以使用::运算符获取它)