kotlin - 内联扩展函数 (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;
生成的,它们的目的是什么,因为它们没有被使用?
解决方案
在此处查看有关 YouTrack 的评论。
调试器使用这些布尔值来确定我们是否在内联函数/lambda 中。 不幸的是, println 是
@InlineOnly
,因此,您不会看到变量的名称(@InlineOnly
函数没有局部变量表和行号信息,尽管这会改变)。但是,如果您创建自己的内联函数然后使用它,您将在 LVT 中使用 $i$f$ 和 $i$a$ 等变量(要查看 LVT,请将 -l 标志传递给 javap)。这些变量的值并不重要(总是假的,尽管将来可以更改),但这些变量的范围是调试器正在查看的内容。如果我们在 $i$f... 范围内,我们在内联函数内,如果我们在 $i$a... 范围内,我们在内联 lambda 内。
推荐阅读
- javascript - 如何在 BookShelf.js 中获取 hasMany 关系
- javascript - AngularJS / Javascript - 如何更新嵌套对象中的任何值
- python - 在“循环”的基础上存储变量
- c - C程序增加字符串中的字母
- java - 使用 Java 以编程方式创建 TestNg Xml 文件
- javascript - 我的反应状态问题有什么解决方案吗?
- node.js - 使用加密模块从 node.js 中的 Curve25519(或 X25519)非对称密钥对生成共享密钥
- javascript - 使用 HTML,我如何操作用户上传的文件,然后允许该用户下载它?
- django - 使用 Django Rest Framework 只查询一次
- c++ - 使用 Rcpp 公开构造函数,该构造函数将指向对象的指针作为参数