Привести метод класса соответственно в Kotlin - PullRequest
1 голос
/ 27 сентября 2019

В Swift, если вы можете сделать следующее:

class MyExampleClass {

   func myMethod(_ value: Int) {

   }

}

let function = MyExampleClass.myMethod // Signature of (MyExampleClass) -> (Int) -> ()
let example = MyExampleClass()
function(example)(10) // Curried

Как мне добиться того же в Kotlin?

class MyExampleClass {

   fun myMethod(value: Int) {

   }

}

val function = MyExampleClass::myMethod // Signature of KFunction2<MyExampleClass, Int, Unit> -- WTF ?
val exampleClass = MyExampleClass()
function(exampleClass)(10) // Compiler error
function.invoke(exampleClass, 10) // works but ugly.. 

exampleClass::myMethod as (Int) -> Unit // WORKS!
MyExampleClass::myMethod as (MyExampleClass) -> (Int) -> Unit // UncheckedCast

Как я могу достичь той же функциональности, что и Swift?Чтобы быть более конкретным, я хотел бы иметь возможность передавать тип (MyExampleClass) -> (Int) -> Unit вместо KFunction2<MyExampleClass, Int, Unit>

Ответы [ 2 ]

4 голосов
/ 27 сентября 2019
  1. Вы можете написать function(exampleClass, 10) вместо function.invoke;

  2. Стандартная библиотека Kotlin не содержит карри, но ее легко реализовать самостоятельно:

    fun <A, B, C> ((A, B) -> C).curry() = { x: A -> { y: B -> this(x, y) } }
    
    val function = MyExampleClass::myMethod.curry()
    function(exampleClass)(10)
    
1 голос
/ 27 сентября 2019

Поскольку invoke метод является оператором, вы можете использовать () синтаксис для вызова его.

function(exampleClass, 10)

Вместо выделки, как предложил Алексей, я хотел бы использовать частичное приложение, чтобы избежать ненужныхэкземпляр:

/** @return partially applied this with the 1st parameter fixed to the specified value */
fun <A, B, C> ((A, B) -> C).invoke(a: A): (B) -> C = { this(a, it) }
function(exampleClass)(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...