Kotlin: Локальная функция передается встроенным функциям как параметр inlined?

При прохождении лямбды или анонимной функции к встроенным функциям в качестве параметра это довольно просто, код вставлен в вызывающую позицию, но при передаче локальной функции в качестве параметра результат кажется другим (как показано ниже). Интересно, если это встраивается? Почему или почему нет?

Например:

inline fun foo(arg: () -> Int): Int { return arg() } fun bar(): Int { return 0 } fun main(args: Array<String>) { foo(::bar) } 

И декомпилированный код Java:

 public final class InlinedFuncKt { public static final int foo(@NotNull Function0 arg) { Intrinsics.checkParameterIsNotNull(arg, "arg"); return ((Number)arg.invoke()).intValue(); } public static final int bar() { return 0; } public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); bar(); } } 

bar() не объявляется встроенным . Так почему вы ожидаете, что он будет встроен ?!

Другими словами: было бы просто неправильно, что подпись метода A влияет (неявно) на подпись другого метода B.

Ваша идея (каким-то образом) повлияет на «семантику» bar () – только потому, что вы использовали bar() качестве аргумента для другого вызова метода.

Как вы можете в декомпилированном коде , kotlin не имеет встроенного bar в вашем случае, но он встраивает его, если он объявлен как inline fun bar() .

Правило состоит в том, что lambdas встроены, когда они передаются в встроенную функцию. Во всех других случаях, например, при передаче ссылки на функцию или лямбда-объекта, встраивание не выполняется.

Intereting Posts
Как получить данные из базы данных Firebase и сохранить их в ListArray <Class>? – Котлин Как не передавать данные Flowable для модульных тестов? Делегация частичного класса в Котлине Как проверить общий тип в Котлин? Содержимое фрагмента скрыто за BottomNavigationView при прокрутке Обнаружение кругов в изображениях opencv MVP + RxJava. Поместите планировщиков в презентаторе или в Interactor? Настройка мультиплатформенного проекта JOOQ с Gradle и Kotlin не генерируют файлы Ошибка библиотеки библиотеки Android: не удается найти установщик для поля. (Котлин) Ошибка «Невозможно объединить dex» при использовании Room + Kotlin Обработка истекших ссылок при разборе JSON из приложения Android Проблема с Kotlin после Android Studio была обновлена ​​до 0,6 Обменный код между модульными испытаниями и контрольно-измерительными тестами при использовании котлина Как оживить анимационный список в Котлине?