Встроенные функции расширения (let / run / also / ...) генерируют неиспользуемые локальные переменные - PullRequest
1 голос
/ 04 августа 2020

Используя Kotlin 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;

и какова их цель, поскольку они не используются?

1 Ответ

0 голосов
/ 04 августа 2020

См. Комментарий к YouTrack здесь .

Эти логические значения используются отладчиком, чтобы определить, находимся ли мы внутри встроенной функции / лямбда или нет. К сожалению , println - это @InlineOnly, поэтому вы не увидите имена переменных (@InlineOnly функции не имеют таблицы локальных переменных и информации о номере номера, хотя это скоро изменится). Однако, если вы создадите свою собственную встроенную функцию, а затем используете ее, вы получите переменные типа $ i $ f $ и $ i $ a $ в LVT (чтобы увидеть LVT, передайте флаг -l в javap). Значение этих переменных не важно (всегда false, хотя оно может быть изменено в будущем), но диапазон этих переменных - это то, на что смотрит отладчик. Если мы находимся внутри диапазона $ i $ f ..., мы находимся внутри встроенной функции, если мы находимся внутри диапазона $ i $ a ..., мы находимся внутри встроенной лямбды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...