Kotlin扩展函数T.()作为参数的理解
Posted 按劳分配
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin扩展函数T.()作为参数的理解相关的知识,希望对你有一定的参考价值。
a:T.() ->Unit 就是T类型的一个匿名扩展函数,他的使用也必须是T对象(比如t是T的一个对象)t.() 调用
它效果等价于a:(T)->Unit 但是用法就不一样了,这样就是普通函数,使用时候是a(t对象)方法传入对象,扩展函数使用是t.a()
var test:CoroutineScope.() -> Unit=
fun test01()
// test()//报错
test(MainScope()) //正常调用
GlobalScope.launch
test()//test就是CoroutineScope的扩展函数,在CoroutineScope函数内就可以直接调用,他其实就是this.test() 因为this可以省略,还是就是扩展函数,对象.方法在使用
/*
public inline fun T.apply(block: T.() -> Unit): T
contract
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
block()
return this
第一,认识到apply这个方法需要传入一个函数
第二,这个函数是不是扩展函数还是什么函数都一样,都是函数就行
第三,T.() 和(T) 写法,在使用apply方法时候,传递参数是一样的,传递的是同一个函数类型
第四,block: T.() -> Unit 表示给T扩展一个叫block的扩展函数
block 是T的扩展函数,他只能在 本次函数体内调用
contract
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
block()
return this
离开这个范围,block 这个T的扩展函数就没办法访问了
因为apply也是T的扩展函数,所以block这个T的扩展函数 也就可以直接调用了,默认就表示当前对象在调用自己的block
block: T.() -> Unit 翻译一下就是 T.block() 写了一个只在apply这个方法体内能够访问的扩展函数
fun <T> T.apply(block: T.() -> Unit): T
这个方法定义 就类似 fun <T> T.apply(block: (T) -> Unit): T
他接受的是一个函数,恰好,这个函数如果是这样写法T.() ,这个函数就是T的一个扩展函数,反正我们要传一个函数就去就行
比如
var aa=fun(s:String)
Log.i("lmj",s+"tag")
"111".apply(aa) 这里就表示 扩展函数aa 被传递到apply,apply在被对象"111".apply这样调用时候,就执行了aa
也就是执行了apply函数体内的block()
*/
以上是关于Kotlin扩展函数T.()作为参数的理解的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin中,理解T.()->Unit 、 ()->Unit与(T) -> Unit