kotlin - 为什么字符串的 Reciver 函数在 kotlin 中被初始化
问题描述
我一直在玩 Kotlin Recivers,直到我被这段代码卡住了
假设这个变量
var greet: String.() -> Unit = {
println("Hello $this")
}
字符串是接收者
() -> Unit是函数类型
我们可以用那种形式来称呼它,这对我来说已经很清楚了
"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"
解决方案
反编译时,您的 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()
像任何常规方法一样使用传入参数的方法。
推荐阅读
- android - 使用外部图库应用打开照片并浏览目录的照片
- r - 用多种函数拟合数据
- python - 具有最小长度的序列
- powershell - 递归函数中属性值的缩短输出
- gitlab - 我应该如何在 Linux 上安装 gitlab-runners?
- maven-central - 我应该如何在 Maven Central 中表示具有两种配置的库?
- javascript - 获取标签 url 返回始终未定义
- webpack - 使用 Foundation 6 设置 Laravel 8
- python - 为什么在 Python 中没有提示 self 类型
- r - list2env(list, envir = .GlobalEnv) 中的错误:names(x) 必须是与 x 长度相同的字符向量