在 Kotlin 接收器对象和扩展上



我正在尝试熟悉更高级的 kotlin 功能,但我不知道为什么我的小代码示例编译和打印"测试 A"而不打印"测试 B"。 谁能告诉我为什么测试B没有打印?

class One{
fun delegate(operation: One.()-> Unit){
operation()
}
fun main(args: Array<String>){
val one= One()
fun One.doIt(){
println("Test A")
}
one.delegate { doIt() } //prints Test A
one.delegate {
fun One.doItDifferently(){
println("Test B")      //not printed
}
}
}

那是因为你不调用函数.toItDifferently(),你只定义它(它是一个局部函数,即在另一个函数中定义的函数(。修改示例以调用函数:

one.delegate {
fun One.doItDifferently(){
println("Test B")
}
doItDifferently() // <- here
}

(UPD,基于评论(您可以使用匿名函数调用delegate,如下所示:

one.delegate( // note the parenthesis, not the curly braces
fun One.(){
println("Test B")
}
)

此声明

one.delegate {
fun One.doItDifferently(){
println("Test B")      //not printed
}
}

将只创建一个带有嵌套函数的空函数。doItDifferently()只是声明,但从未调用。因此,println("Test B")永远不会被执行。

你没有调用这个函数。

这是类One上的本地扩展函数,您只是在声明它。它现在存在并且可以在当前范围内使用,但本身什么都不做。

您需要调用/调用它才能执行任何操作,就像任何常规方法一样:

一.委托 { 有趣的一.doItDifferent(({ println("Test B"( }doItDifferent((}

IntelliJ实际上会给你一个警告,说这个函数永远不会被使用。

编辑:根据您的评论,您根本没有传递该函数。如果要返回函数,因为反射不支持本地函数,这还是不可能的。

如果您尝试此操作:

第一类 { 有趣的委托(操作: 一.(( -> KFunction<*>( { 操作((.调用(这( } } fun main(args: Array( { val one = One(( 有趣的一个.doIt(( { println("Test A"( } 一.委托 { 有趣的一.doItDifferent(( { println("Test B"(//未打印 } 这::d o它不同 } }

你会得到:

线程"main"中的异常 kotlin.reflect.jvm.internal.KotlinReflectionInternalError:Kotlin 反射尚未完全支持自检本地函数、lambda 和匿名函数