一、具体的扩展方法
public inline fun <T, R> T.run(block: T.() -> R): R = block()
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
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 }
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
解释:
run:
任意函数的扩展函数,该函数需要传入一个无参的匿名函数,假定对象O调用该方法,
二、调用
/为需要替换的部分
fun letTest() {
error { "------------------TEST LET/RUN/WITH/ALSO/APPLY MEHOD------------------" }
var data = view.let/run/with/also/apply {
error { "this->$this" }
error { "it->$it" }/ error { "没有参数,无法输入it" }
"reMode"
}
error { data }
}
三、具体的值
------------------TEST RUN MEHOD------------------
this->android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
没有参数,无法输入it
reMode
------------------TEST LET MEHOD------------------
this->com.xly.kotlinupdate.anko.LetApplyAlsoRunWithCompare@4e2b7d3
it->android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
reMode
------------------TEST APPLY MEHOD------------------
this->android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
没有参数,无法输入it
android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
------------------TEST ALSO MEHOD------------------
this->com.xly.kotlinupdate.anko.LetApplyAlsoRunWithCompare@4e2b7d3
it->android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
------------------TEST WITH MEHOD------------------
this->android.widget.TextView{6613a0d V.ED.... ......ID 0,0-0,0}
没有参数,无法输入it
reMode
四、应用场景
4.1、with持有调用者对象,然后返回任意对象 默认未写返回值时,返回Unit)
4.2、run与with功能相同,当流式编程的时候(xxx.run{})可以考虑采用run
4.3、apply持有调用者对象,并强制返回该对象。当需要修改某个属性,并重新赋值给其他对象时可以考虑采用
4.4、also持有调用者所在类对象,并强制返回调用者对象
4.5、let 持有调用者所在类对象 ,返回任意对象。