首页 > 解决方案 > 在 Kotlin 中适当地转换类方法

问题描述

如果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>

标签: swiftkotlin

解决方案


  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)
    

推荐阅读