序、慢慢来才是最快的方法。
Kotlin 中的 let
、run
和 apply
都是 Scope Functions(作用域函数),用于限定一个代码块的作用域。它们的区别在于返回值和使用场景上。
源码:
- @kotlin.internal.InlineOnly
- public inline fun
T.let(block: (T) -> R): R { - contract {
- callsInPlace(block, InvocationKind.EXACTLY_ONCE)
- }
- return block(this)
- }
使用:
- intent.extras?.let {
- shareId = it.getInt(Constant.CONTENT_ID_KEY, -1)
- shareTitle = it.getString(Constant.CONTENT_TITLE_KEY, "")
- shareUrl = it.getString(Constant.CONTENT_URL_KEY, "")
- }
let
函数是将一个对象作为 lambda 表达式的参数,在 lambda 表达式内部可以通过 it
引用这个对象。它的返回值是 lambda 表达式的执行结果。let
函数的返回值就是 lambda 表达式的执行结果,所以我们可以继续链式调用另一个 let
函数,并在其内部打印出转换后的字符串。let
函数适合对一个对象进行一系列处理,并返回处理结果的场景。源码:
- @kotlin.internal.InlineOnly
- public inline fun
T.run(block: T.() -> R): R { - contract {
- callsInPlace(block, InvocationKind.EXACTLY_ONCE)
- }
- return block()
- }
使用:
- toolbar.run {
- title = resources.getString(R.string.login)
- setSupportActionBar(this)
- supportActionBar?.setDisplayHomeAsUpEnabled(true)
- }
源码
- @kotlin.internal.InlineOnly
- public inline fun
T.apply(block: T.() -> Unit): T { - contract {
- callsInPlace(block, InvocationKind.EXACTLY_ONCE)
- }
- block()
- return this
- }
使用
- toolbar.apply {
- title = ""//getString(R.string.loading)
- setSupportActionBar(this)
- supportActionBar?.setDisplayHomeAsUpEnabled(true)
- }