我正在尝试熟悉更高级的 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 和匿名函数