首页 > 解决方案 > 内联扩展函数 (let/run/also/...) 生成未使用的局部变量

问题描述

使用科特林1.4-rc
对于此代码块:

try {
   socket.getOutputStream().let {
      it.write(bytes)
      it.flush()
   }
} catch (e: IOException) {
   ...
}

反编译结果为:

try {
   OutputStream var2 = this.socket.getOutputStream();
   boolean var3 = false;
   boolean var4 = false;
   int var6 = false;
   var2.write(bytes);
   var2.flush();
} catch (IOException var7) {
   ...
}

那么,为什么是

boolean var3 = false;
boolean var4 = false;

生成的,它们的目的是什么,因为它们没有被使用?

标签: kotlin

解决方案


在此处查看有关 YouTrack 的评论。

调试器使用这些布尔值来确定我们是否在内联函数/lambda 中。 不幸的是, println 是 @InlineOnly,因此,您不会看到变量的名称(@InlineOnly 函数没有局部变量表和行号信息,尽管这会改变)。但是,如果您创建自己的内联函数然后使用它,您将在 LVT 中使用 $i$f$ 和 $i$a$ 等变量(要查看 LVT,请将 -l 标志传递给 javap)。这些变量的值并不重要(总是假的,尽管将来可以更改),但这些变量的范围是调试器正在查看的内容。如果我们在 $i$f... 范围内,我们在内联函数内,如果我们在 $i$a... 范围内,我们在内联 lambda 内。


推荐阅读