扩展和高阶函数引用
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=获取) ] 运算符)
我对其中的每一个都有一个整体的了解,我写了一段代码,但是我不太明白它为什么起作用。
问题是 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=获取) ] 运算符)