Вдохновленный этим вопросом , я думал о том, как можно встроить параметр приемника в функцию расширения? Теоретически так:
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
приводит только к синтаксическим ошибкам.
Невозможность встроить вторую функцию снижает производительность по сравнению с первой.
Есть ли какой-нибудь способ сказать компилятору встроить этот параметр получателя?