函數(shù)介紹
apply
fun <T> T.apply(f: T.() -> Unit): T { f(); return this }
返回值是本身
run
run函數(shù)和apply函數(shù)很像,只不過(guò)run函數(shù)是使用最后一行的返回,apply返回當(dāng)前自己的對(duì)象。
fun <T, R> T.run(f: T.() -> R): R = f()
let
默認(rèn)當(dāng)前這個(gè)對(duì)象作為閉包的it參數(shù),返回值是函數(shù)里面最后一行蛮穿,或者指定return
fun <T, R> T.let(f: (T) -> R): R = f(this)
let是將當(dāng)前的函數(shù)傳入后面的閉包中(it),可以隨意指定返回值得類(lèi)型
是不是意味著可以在let中,對(duì)其本身進(jìn)行操作毁渗。而其他的不行呢践磅?
also
從1.1新增的方法
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
感覺(jué)是 apply 之于run 的,also至于let的存在灸异。
都是在本身的調(diào)用方式上府适,強(qiáng)制返回本身
with
with函數(shù)是一個(gè)單獨(dú)的函數(shù),并不是Kotlin中的extension肺樟,所以調(diào)用方式有點(diǎn)不一樣檐春,返回是最后一行,然后可以直接調(diào)用對(duì)象的方法么伯,感覺(jué)像是let和apply的結(jié)合疟暖。
fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
let難道不能指定返回自己?jiǎn)幔?/p>
總結(jié)
針對(duì)上面的疑問(wèn),用下面的代碼進(jìn)行了總結(jié)
//apply
m.apply {
//1.調(diào)用函數(shù)可以直接寫(xiě)
println(getMpValue())
//2.如果調(diào)用外部函數(shù)對(duì)本身進(jìn)行操作.通過(guò)this指代
doChangeMp(this)
println(getMpValue())
//返回值強(qiáng)制就是本身
}
//run
m.run {
//1.調(diào)用函數(shù)直接寫(xiě)
//1.調(diào)用函數(shù)可以直接寫(xiě)
println(getMpValue())
//2.如果調(diào)用外部函數(shù)對(duì)本身進(jìn)行操作.通過(guò)this指代
doChangeMp(this)
println(getMpValue())
//返回值可以自己定義.如果寫(xiě)this,就是和apply一模一樣
this
}
//let的三個(gè)點(diǎn)
m.let {
//1.調(diào)用是需要調(diào)用it,才能調(diào)用自身的方法。
println(it.getMpValue())
//2.調(diào)用函數(shù)對(duì)it進(jìn)行操作
doChangeMp(it)
println(it.getMpValue())
//3.最后一行返回值返回自己
it
}
m.also {
//1.調(diào)用是需要調(diào)用it,才能調(diào)用自身的方法俐巴。
println(it.getMpValue())
//2.調(diào)用函數(shù)對(duì)it進(jìn)行操作
doChangeMp(it)
println(it.getMpValue())
//返回值強(qiáng)制就是本身
}
//with
//首先不是拓展函數(shù)骨望。是單獨(dú)的函數(shù)。其實(shí)with和run相似
with(m){
//調(diào)用方式和apply和run相似
println(getMpValue())
//2.如果調(diào)用外部函數(shù)對(duì)本身進(jìn)行操作.通過(guò)this指代
doChangeMp(this)
println(getMpValue())
//返回值可以自己定義.如果寫(xiě)this,就是和apply一模一樣
this
}
不同
let
和also
因?yàn)槭褂?code>it作為指代本身的關(guān)鍵字欣舵,就可以釋放this
關(guān)鍵字的使用了擎鸠。
官網(wǎng)上的例子:
fun Block.copy() = Block().also { it.content = this.content }
其他
- T.apply{}
和
T.run{}其實(shí)是一樣的。
apply`只是將本身做了強(qiáng)制的返回邻遏。 -
T.also{}
和T.let{}
其實(shí)是一樣的糠亩。also
只是將本身做了強(qiáng)制的返回。 -
with(T){}
和T.run{}
其實(shí)是一致的准验。不同之處是,with
是單獨(dú)的函數(shù)廷没。 - 四者目前來(lái)看糊饱,沒(méi)有什么不同。都能完成一樣的工作颠黎。