Рубрики
Без рубрики

Декомпилированная история Котлина “давай и беги”

Введение Некоторое время назад я потратил довольно много времени, пытаясь понять, почему простой блок o… Помечен как kotlin, java, android.

Некоторое время назад я потратил довольно много времени, пытаясь понять, почему простой блок кода Kotlin не хотел делать то, что я хотел, чтобы он делал. После многочисленных попыток переписать свой код, думая, что это, должно быть, была ошибка с моей стороны, я решил погрузиться в сгенерированный код, чтобы попытаться выяснить, что происходит в фоновом режиме.

Тема пусть и запустите , 2 встроенные функции из стандартной библиотеки Kotlin, доступные разработчикам. То, как я думал, что пусть и запуск работа в комбинации были аналогичны классическому оператору if/else. Поэтому я начал и продолжал использовать их таким образом, пока не наткнулся на стену, когда я что-то реализовывал в одном проекте.

Давайте посмотрим, в чем проблема:

Итак, в этом примере у нас есть простой класс Kotlin с 2 обнуляемыми переменными, одна из которых уже определена со значением. Теперь, глядя на код, возникает вопрос: что было бы напечатано в консоли, если бы я вызвал функцию do Some Awesome Printing()?

Если бы вы ничего не сказали, к сожалению, это было бы неверно . Правильный ответ был бы “потрясающий результат 1” . Я знаю, в этом нет никакого смысла, верно?

Что здесь происходит? Давайте декомпилируем этот простой пример в Java и посмотрим, что получилось:

Хорошо, хорошо, теперь это имеет смысл, я имею в виду код. Мы можем ясно видеть, что эта функция будет выполняться до конца и выведет “потрясающий вывод 1” в конце, потому что вторая переменная действительно была нулевой и не выполняла возврат.

Теперь давайте быстро рассмотрим еще один пример и в конце концов вместе найдем решение.

В этом следующем примере мы изменим только одну вещь, а именно добавим блок run или оператор elvis для второй переменной let операция:

Как вы думаете, что было бы напечатано, если бы снова была вызвана функция do Some Awesome Printing()? Да, он выведет “потрясающий результат 3”!

Теперь это делает то, что вы хотели бы, это похоже на реальное утверждение if/else. И код декомпилятора Java также подтверждает это:

Спасибо Дэнни за упоминание об этом, казалось бы, что другая встроенная функция Kotlin сделает свое дело.

Итак, после того, как я попробовал то, что предложил Дэнни, это сработало! Теперь давайте посмотрим, что происходит под капотом при использовании встроенной функции apply Kotlin в тех же примерах, что и раньше.

Результат? На самом деле ничего. Давайте посмотрим, как выглядит декомпилированный код на этом примере, и попытаемся понять механику:

После декомпиляции того же блока, но с помощью apply теперь у нас есть другой Java-код, который ничего не выводит, как можно было бы ожидать.

И, наконец, давайте рассмотрим еще один пример, в котором мы бы поймали нулевое значение внутренней переменной с помощью оператора elvis и блока run :

Кого-нибудь интересует результат? На консоли будет выведен “удивительный вывод 3”, так как удивительный Var2 равен нулю . Давайте углубимся в код декомпилятора Java, чтобы лучше понять, что здесь произошло:

Немного сложнее, чем в предыдущих примерах, но примерно с тем же результатом, консоль выведет “потрясающий вывод 3”, как и предполагалось, и мы знаем, что имеем лучшее представление о том, почему и как.

В части 2 этой темы мы углубимся в то, как компилятор Kotlin компилирует встроенные функции из стандартной библиотеки, и лучше поймем поведение, упомянутое в этой статье. Так что следите за обновлениями.

В то же время вы всегда можете погрузиться в исходный код этих конкретных функций, разрешить , запустить и применить .

Хотя вы, конечно, все еще можете использовать встроенную функцию let в обычном режиме, как у вас уже есть, просто будьте осторожны с эффектом, упомянутым в этой статье, и убедитесь, что ваш вариант использования работает должным образом.

Всегда интересно открывать для себя такие вещи, чтобы лучше понять инструменты и языки, которые мы используем ежедневно. Открывая для себя подобные вещи, мы совершенствуемся, но, делясь ими, мы также помогаем другим совершенствоваться.

С учетом этого я хотел бы поблагодарить вас за то, что дочитали эту статью до конца. Я действительно надеюсь, что это дало вам некоторую ясность в отношении того, как код Kotlin генерируется на Java, и как эта конкретная тема может повлиять на код, который вы пишете каждый день. Если вы нашли эту статью интересной, пожалуйста, не стесняйтесь поделиться ею и поставить лайк ниже.

Примечание: Декомпилированный Java-код, показанный в этом посте, не является точным эквивалентом того, который генерируется. Я удалил ненужный код, чтобы сделать его короче и немного более читабельным для целей этой статьи.

Оригинал: “https://dev.to/vlazdra/a-decompiled-story-of-kotlin-let-and-run-4k83”