KFunction
s предназначены для представления функций, которые явно объявлены в коде Kotlin, но f2
не объявлено нигде в коде.Кроме того, KFunction
имеет множество свойств и функций отражения, которые не относятся к применяемой функции f2
.Поэтому, даже если это возможно, это не рекомендуется.
Если вы все равно хотите это сделать, вы можете просто написать функцию applyArgument
следующим образом:
fun <T, R> KFunction1<T, R>.applyArgument(value: T): KFunction0<R> {
return object : KFunction<R> by this, KFunction0<R> {
override fun invoke(): R {
return this@applyArgument(value)
}
}
}
Но, если вам нужно сохранить имя, я бы сделалэто безопасным способом.Одним из способов может быть:
data class Named<out T>(val name: String, val value: T)
fun <T, R> Named<T>.map(transform: (T) -> R): Named<R> = Named(name, transform(value))
val <F : KFunction<*>> F.named: Named<F>
get() = Named(name, this)
Тогда используйте его:
fun foo(x: Int) = 2 * x
val f: Named<(Int) -> Int> = ::foo.named
val f2: Named<() -> Int> = f.map { fValue -> { fValue(42) } }
assertEquals("foo", f2.name)
assertEquals(84, f2.value())