在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.delegate { 有趣的One.doItDifferently(){ println(“测试B”) } doItDifferently() }
IntelliJ实际上会给你一个警告,这个函数从来没有使用过。
编辑:根据您的评论,你没有通过该功能。 这是不可能的,如果你想返回的功能,因为反射不支持本地功能。
如果你尝试这个:
class One { 有趣的委托(操作:一。() - > KFunction <*>){ 操作()调用(这) } } fun main(args:Array){ val one = One() 有趣的One.doIt(){ println(“测试A”) } one.delegate { 有趣的One.doItDifferently(){ println(“测试B”)//未打印 } 这:: doItDifferently } }
你会得到:
线程“main”中的异常kotlin.reflect.jvm.internal.KotlinReflectionInternalError:反射本地函数,lambdas和匿名函数在Kotlin反射中尚未得到完全支持