Kotlin:对let,apply,run,also等作用域函数的理解

博客主要对Kotlin的4个内联函数进行归纳。按参数分类,let和also一类,run和apply一类。分别阐述了let与also、run与apply的相同点和不同点,重点对比了它们在参数传递、返回值等方面的差异,帮助理解Kotlin内联函数的使用。

在理解这些函数之前,先从源码中摘抄出相关的代码, 放在一起,方便比较,总结规律(省略了函数的注解和部分代码, 不影响理解,了解这些代码的可以略过)

public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
public inline fun <T, R> T.run(block: T.() -> R): R = return block()
public inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}
public inline fun <T> T.also(block: (T) -> Unit): T {
    block(this)
    return this
}

以下是对4个内联函数的归纳

函数和参数类型以及返回值
函数名参数:函数作参数返回值
let(T) -> RR
runT.() -> RR
applyT.() -> UnitT 也就是 this
also (T) -> UnitT 也就是 this

按照参数分类:letalso可以分为一类,runapply分为一类,

1:let和also的相同点:

参数都是一个普通函数, 而且把调用者T作为一个参数传递到参数函数中,这样,在这个参数函数的作用域中就可以使用T这个参数了;

而且这个T参数还有一个默认的名称 it,it这个变量名称是可以修改的,如果不明白为啥能修改,可以把(T)-> R看成(it:T)-> R这样的普通函数,it就是个变量名称,也可以改成其他的名称(t:T)-> R或是 (a:T)-> R,不管是it,t,a,都指代的是T的实例对象。

it可以修改成自己想要的变量名称,让变量意义更加明显

 

also的也可以改

 

1.1: let和also的不同点:

返回值不一样,let的返回值跟它的参数函数的返回值是一致的,let的返回值是由参数函数的返回值决定的,参数函数的返回值是这个函数的最后一行或是指定的return对象

而also的返回值,指定了就是this,谁调用就返回谁,

 2:run和apply的相同点

 他们的参数函数都是T.() -> 返回值 这种形式,T.() -> 返回值的意思就是 T的扩展函数是() -> 返回值, .的意思就是

// T. 的意思就是 T的
// T.apply 的意思就是 T的扩展函数,名叫apply
// T的扩展函数apply的参数, 是T的另一个扩展函数  () -> Unit
// 这个作参数的扩展函数没有参数名称, 只有一个函数的形式 () -> Unit, 意思就是没有参数,返回值是Unit
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

通俗的讲就是哪个实例调用的run和apply,那么传递的参数函数就是这个实例所在类的一个扩展函数。

既然apply和作为参数的扩展函数都是属于T的, 那么在参数的扩展函数中,就可以使用this来指代这个T的实例了, 可以想一下, 原有函数也好,扩展函数也好, 都是属于同一个类,那么在扩展函数也是可以使用this, 所以在apply和run函数中都可以使用this来指代调用者, 

 那么这里的this,可不可以修改呢?答案是不可以的。这里的this跟上面说的it不是一个概念,it是一个变量名称,当然可以想改就改了,this是指代调用者,比如说上面的这个例子,this就是指代的button,button就是一个变量名称,已经固定了,就不能再做更改了。

2.2:run和apply的不同点

 就是返回值类型不同了,run函数的返回值是取决于参数函数的返回值类型,所以run函数的返回值就是作为参数的扩展函数的返回值,可以是任意类型,那就看扩展函数中最后返回的是什么了

apply的返回值就不一样了,它的返回值已经固定了,就是返回this,意思是谁调用apply,就返回谁,比如上面的例子button调用了apply,那么返回的就是button。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值