我总体上了解了这些是什么,我编写了一段代码但是我不太明白它为什么会起作用。
事情是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)
}
答案 0 :(得分:2)
关于你的第一个问题,这两个是等价的:
"testString".extensionFun()
extensionFun("testString")
这就是为什么传递printString
方法不会导致编译错误。
关于第二个问题,区别在于highOrderFun
已经是对函数的引用,而printString
不是函数引用(但您可以使用::
运算符获取它)