Kotlin 内联扩展函数(let/run/allow/…)生成未使用的局部变量
使用KotlinKotlin 内联扩展函数(let/run/allow/…)生成未使用的局部变量,kotlin,Kotlin,使用Kotlin1.4-rc 对于此代码块: try { socket.getOutputStream().let { it.write(bytes) it.flush() } } catch (e: IOException) { ... } 反编译结果为: try { OutputStream var2 = this.socket.getOutputStream(); boolean var3 = false; boolean va
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;
已生成,由于它们未使用,它们的用途是什么?请参阅YouTrack上的评论
调试器使用这些布尔值来确定我们是否在内联函数/lambda中。
不幸的是,println是@InlineOnly
,因此,您将看不到变量的名称(@InlineOnly
函数没有局部变量表和行号信息,尽管这将发生更改)。但是,如果您创建自己的内联函数并使用它,您将在LVT中创建$i$f$和$i$a$等变量(要查看LVT,请将-l标志传递给javap)。这些变量的值并不重要(始终为false,尽管将来可以更改),但这些变量的范围是调试器要查看的。如果我们在$i$f…范围内,我们在内联函数内,如果我们在$i$a…范围内,我们在内联lambda内
请参阅YouTrack上的评论
调试器使用这些布尔值来确定我们是否在内联函数/lambda中。
不幸的是,println是@InlineOnly
,因此,您将看不到变量的名称(@InlineOnly
函数没有局部变量表和行号信息,尽管这将发生更改)。但是,如果您创建自己的内联函数并使用它,您将在LVT中创建$i$f$和$i$a$等变量(要查看LVT,请将-l标志传递给javap)。这些变量的值并不重要(始终为false,尽管将来可以更改),但这些变量的范围是调试器要查看的。如果我们在$i$f…范围内,我们在内联函数内,如果我们在$i$a…范围内,我们在内联lambda内