Как я могу встроить параметр приемника функции расширения в Kotlin? - PullRequest
0 голосов
/ 28 августа 2018

Вдохновленный этим вопросом , я думал о том, как можно встроить параметр приемника в функцию расширения? Теоретически так:

inline fun <T> not(crossinline predicate : (T) -> Boolean)
    = { e : T -> !predicate(e) }

Просто predicate становится функцией нашего приемника:

operator inline fun <T> ((T) -> Boolean).not()
    = { e : T -> !this(e) }

Теперь, для приведенного выше кода, я ожидаю, что компилятор пожалуется, что ему нужен crossinline; однако я получаю следующее предупреждение:

Предупреждение: ожидаемое влияние производительности на встраивание public inline operator fun <T> ((T) -> Boolean).not(): (T) -> Boolean незначительно. Подкладка лучше всего подходит для функций с параметрами функциональных типов

Это позволяет мне верить, что компилятор не указывает на приемник этой функции. Добавление inline или crossinline приводит только к синтаксическим ошибкам.

Невозможность встроить вторую функцию снижает производительность по сравнению с первой.

Есть ли какой-нибудь способ сказать компилятору встроить этот параметр получателя?

1 Ответ

0 голосов
/ 13 марта 2019

Это отслеживается в https://youtrack.jetbrains.com/issue/KT-5837,, но, похоже, активно не работает :( На самом деле только что предложил поддержку noinline / crossinline, надеясь, что это основная причина, по которой получатель не не встроен.

...