问题描述
在 Kotlin 中,代码片段 val f = println()
将函数 println
(它是第一类对象)绑定到名称 f
。
语法 val f = map
不起作用,val f = arrayOf(1,2,3).map
也不起作用。我尝试了上述的各种变体,但都没有成功。
另外(和相关的),为什么 val f = println
不起作用,需要括号?我来自函数式编程阵营(Scheme),在那里这绝对是正常的。
(免责声明:绝对 Kotlin 新手,努力自学。)
解决方法
在 Kotlin 中,代码片段 val f = println()
将函数 println
(它是第一类对象)绑定到名称 f
。
不是真的。这将调用 println()
的返回值结果,即 Unit
,分配给变量 f
。要获取函数引用,请使用 ::
。但是还必须指定变量类型,因为函数有重载时无法推断:
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