IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin:对letapplyrunalso等作用域函数的理解 -> 正文阅读

[移动开发]Kotlin:对letapplyrunalso等作用域函数的理解

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

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。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:32:03  更:2021-08-10 13:33:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 23:11:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码