在Kotlin接收器对象和扩展

我试图熟悉更先进的kotlinfunction,但我不知道为什么我的小代码示例编译和打印“测试A”,而不是打印“测试B”。 有人可以告诉我为什么测试B不打印?

class One{ fun delegate(operation: One.()-> Unit){ operation() } fun main(args: Array){ 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实际上会给你一个警告,这个函数从来没有使用过。

编辑:根据您的评论,你没有通过该function。 这是不可能的,如果你想返回的function,因为reflection不支持本地function。

如果你尝试这个:

  class One {
    有趣的委托(操作:一。() - > KFunction <*>){
        操作()调用(这)
     }
 }

 fun main(args:Array){
     val one = One()
    有趣的One.doIt(){
         println(“测试A”)
     }
     one.delegate {
        有趣的One.doItDifferently(){
             println(“测试B”)//未打印
         }
        这:: doItDifferently
     }
 } 

你会得到:

线程“main”中的exceptionkotlin.reflect.jvm.internal.KotlinReflectionInternalError:reflection本地函数,lambdas和匿名函数在Kotlinreflection中尚未得到完全支持