首页 > 解决方案 > 为什么字符串的 Reciver 函数在 kotlin 中被初始化

问题描述

我一直在玩 Kotlin Recivers,直到我被这段代码卡住了

假设这个变量

 var greet: String.() -> Unit = {
        println("Hello $this")
    }

我们可以用那种形式来称呼它,这对我来说已经很清楚了

  "my extintion  text".greet()  //--> prints "Hello extintion  text"

但是 通过这种方法我无法理解初始化greet 变量背后的技巧,因为我们没有设置任何参数以及Kotlin如何将我传递的值(“my extintion text”)识别为字符串并在其上使用greet exintion

greet("also my extintion  text") //--- prints "Hello also extintion text"

标签: kotlin

解决方案


反编译时,您的 lambda 显示如下:

 public interface Function1<in P1, out R> : Function<R> {
 /** Invokes the function with the specified argument. */
 public operator fun invoke(p1: P1): R
}

这就是该Main方法的样子:

public final class MainKt {
public static final void main() {
  Function1 greet = (Function1)null.INSTANCE;  //Your 'greet' is of Function1 type which has 'invoke' method.
  greet.invoke("my extintion  text"); //Calling the 'invoke' method of Function1.
}

编译器调用invoke()传递"my extintion text"字符串的方法并打印它

没有什么技巧,编译器最终会invoke()像任何常规方法一样使用传入参数的方法。


推荐阅读