如何将方法绑定到 Kotlin 中的名称?
How does one bind a method to a name in Kotlin?
在 Kotlin 中,代码片段 val f = println()
将函数 println
(这是第一个 class 对象)绑定到名称 f
.
How do I do the same with the method map
, i.e. store it in f
?
语法 val f = map
不起作用,val f = arrayOf(1,2,3).map
也不起作用。我已经尝试了上述的各种变体,但没有成功。
另外(和相关),为什么 val f = println
不起作用,使括号变得必要?我来自函数式编程阵营(Scheme),在那里这绝对是正常的。
(免责声明:绝对的Kotlin新手,努力自学。)
In Kotlin, the code snippet val f = println()
binds the function println
(which is a first class object) to the name f
.
不正确。这将调用 println()
的 return 值结果赋值给变量 f
,即 Unit
。要获取函数引用,请使用 ::
。但是你还必须指定变量类型,因为当函数有重载时无法推断:
val f: (Any)->Unit = ::println
具有接收者的函数应使用接收类型指定,如
val f = Any::toString
// or, to bind a specific instance's toString:
val myList = listOf("Hello", "World")
val myListToString = myList::toString
由于map
是一个高阶函数,它有一个又长又复杂的签名:
val f: Array<Int>.((Int)->String)->List<String> = Array<Int>::map
在 Kotlin 中,代码片段 val f = println()
将函数 println
(这是第一个 class 对象)绑定到名称 f
.
How do I do the same with the method
map
, i.e. store it inf
?
语法 val f = map
不起作用,val f = arrayOf(1,2,3).map
也不起作用。我已经尝试了上述的各种变体,但没有成功。
另外(和相关),为什么 val f = println
不起作用,使括号变得必要?我来自函数式编程阵营(Scheme),在那里这绝对是正常的。
(免责声明:绝对的Kotlin新手,努力自学。)
In Kotlin, the code snippet
val f = println()
binds the functionprintln
(which is a first class object) to the namef
.
不正确。这将调用 println()
的 return 值结果赋值给变量 f
,即 Unit
。要获取函数引用,请使用 ::
。但是你还必须指定变量类型,因为当函数有重载时无法推断:
val f: (Any)->Unit = ::println
具有接收者的函数应使用接收类型指定,如
val f = Any::toString
// or, to bind a specific instance's toString:
val myList = listOf("Hello", "World")
val myListToString = myList::toString
由于map
是一个高阶函数,它有一个又长又复杂的签名:
val f: Array<Int>.((Int)->String)->List<String> = Array<Int>::map