kotlin高阶函数问题


#1

我定义了三个函数fun1 fun2 fun3如下代码:

    var fun1: (String) -> Unit = {
        println(it.length)
    }

    var fun2: String.() -> Unit = {
        println(length)
    }

    var fun3: Function1<String, Unit> = {
        println(it.length)
    }

这三个函数的类型都是一样的 可以相互赋值
    fun1 = fun2
    fun2 = fun3
    fun3 = fun1

但是让我不理解的是fun2中,lambda中隐士参数是this 也就是String对象,可以直接调用String的方法
而fun1和fun2中lambda隐士参数是it,只能通过it来调用传递进来的String对象的方法
我看了下 编译过后的代码 其实这三个方法都是会生成一个Function1实例,然后调用invoke方法
把String传递进去的,没有任何区别
请大神帮忙解释一下

image


#2

我要是没记错的话,fun1和fun3是一样的,但是fun2有一点不同。
你可以这么使用fun2:

val str = "hello kotlin"
str.fun2()

但是其他两个不行。
fun2中的String.()会将String实例作为接受者传入函数中,使得你可以调用接受者内部的方法,在这个例子里面就是String里面的方法啦。既然是接受者,就可以通过对象接函数的形式来调用,即str.fun2()
建议看看几个函数的对比:letapplywithrunapplywith是带有接受者的lambda函数。
我看到大多数人都推荐使用let不容易出错,但是我还是觉得apply好用2333
第一次发帖不知道说的对不对> <


#3

其实这几个函数在运行时都是一样的,fun2不同也只是语法糖而已


京ICP备16022265号-2 Kotlin China 2017 - 2018