swift - 在 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>
解决方案
你可以写
function(exampleClass, 10)
而不是function.invoke
;Kotlin 标准库不包含柯里化,但很容易自己实现:
fun <A, B, C> ((A, B) -> C).curry() = { x: A -> { y: B -> this(x, y) } } val function = MyExampleClass::myMethod.curry() function(exampleClass)(10)
推荐阅读
- postgresql - postgres 的 Springboot application.properties 不起作用 - 致命:数据库“null”不存在
- jquery - jQuery 创建一个自动完成表单
- java - TestNG 依赖于方法
- jupyter-notebook - 为什么我在启动 Jupyter 时会被重定向?
- python - 将数据框作为 csv 文件从 google colab 导出到 google drive
- c# - C#调用WinApi?
- python - 使用 GPU 在 Python/Numba 中计算前 N 个最近城市的更好方法
- .htaccess - 使用 HTACCESS 从 iindex.php?r=sdft2345 重定向到 dft2345 ,可能吗?
- gradle - 如何在 Kotlin DSL 中的“运行”上设置系统属性
- excel - 为什么步骤 (-1) 给我一个应用程序定义或对象定义的错误,而不是步骤 (-2)