【问题标题】:How does one bind a method to a name in Kotlin?如何将方法绑定到 Kotlin 中的名称?
【发布时间】:2021-09-13 19:43:44
【问题描述】:

在 Kotlin 中,代码 sn-p val f = println() 将函数 println(它是第一类对象)绑定到名称 f

我如何使用方法map 做同样的事情,即将它存储在f 中?

语法val f = map 不起作用,val f = arrayOf(1,2,3).map 也不起作用。我尝试了上述的各种变体,但没有成功。

另外(和相关),为什么val f = println 不起作用,需要括号?我来自函数式编程阵营(Scheme),这绝对是正常的。

(免责声明:绝对的 Kotlin 新手,试图自学。)

【问题讨论】:

    标签: function kotlin lambda syntax anonymous-function


    【解决方案1】:

    在 Kotlin 中,代码 sn -p 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      相关资源
      最近更新 更多