扩展和高阶函数引用

Extension and higher-order functions referencing

我对其中的每一个都有一个整体的了解,我写了一段代码,但是我不太明白它为什么起作用。
问题是 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)
}

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

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

这就是传递 printString 方法不会导致编译错误的原因。

关于第二个问题,不同的是highOrderFun已经是函数引用,而printString不是函数引用(但是可以通过[=14=获取) ] 运算符)