Kotlin Academy · 课时

let 与 run:转换与作用域

使用 let 进行空安全转换,使用 run 执行局部计算。

第 2 / 4 课13 个步骤

let 与 run:转换与作用域 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

let 与 run

let 使用 it 作为接收者;run 使用 this。两者都会返回 Lambda 表达式的最后一个表达式。请根据您是否偏好显式引用来选择。

let 基础知识

let 会将接收者作为 it 传递给 Lambda 表达式。它适合转换值,或限制变量的作用域。

fun main() {
    val length = "Kotlin".let { it.length }
    println(length) // 6
}

let 与可空值

经典用法:obj?.let { ... } 仅在 obj 非空时运行代码块。

fun main() {
    val name: String? = "Ada"
    val upper = name?.let { it.uppercase() } ?: "(unknown)"
    println(upper) // ADA
}

使用 let 进行转换

使用 let 转换值,同时保持链式调用的可读性。

fun main() {
    val numStr = "42"
    val doubled = numStr.let { it.toInt() }.let { it * 2 }
    println(doubled) // 84
}

使用 let 限制作用域

将变量的可见范围限制在一个较小的代码块中,这是避免命名空间污染的简洁方式。

fun main() {
    val username = readUserConfig().let { config ->
        config.uppercase()
    }
    println(username)
}
fun readUserConfig() = "ada"

run 基础知识

run 的工作方式类似于 let,但使用 this 而不是 it。当您希望调用接收者的多个成员时,它很有用。

class Rect(val w: Int, val h: Int) {
    fun area() = w * h
    fun perimeter() = 2 * (w + h)
}
fun main() {
    val description = Rect(3, 4).run {
        "area=${area()}, perimeter=${perimeter()}"
    }
    println(description)
}

将 run 用作独立代码块

run { ... }(不带接收者)会运行代码块并返回其结果,适合将多个计算组合在一起。

fun main() {
    val result = run {
        val a = 10
        val b = 20
        a + b
    }
    println(result) // 30
}

根据接收者风格比较 let 与 run

如果 Lambda 表达式主体会访问接收者的多个成员,run 可以避免使用 it.。如果只使用接收者一两次,使用 let 会更易读。

class User(val name: String, val email: String, val age: Int)
fun main() {
    val user = User("Ada", "ada@x.io", 35)
    // run: this-style
    val s1 = user.run { "$name <$email> age $age" }
    // let: it-style
    val s2 = user.let { "${it.name} <${it.email}> age ${it.age}" }
    println(s1); println(s2)
}

组合使用 let 与 Elvis

将 ?.let { ... } 与 ?: 结合起来,是一种强大的空安全链式流程模式。

fun main() {
    val raw: String? = "  hello  "
    val cleaned = raw?.let { it.trim().uppercase() } ?: "(empty)"
    println(cleaned) // HELLO
}

使用 run 配置并返回结果

在同一个代码块中,通过 this 完成设置,同时返回一个值。

class Connection {
    var host: String = ""
    fun connect() = "connected to $host"
}
fun main() {
    val status = Connection().run {
        host = "localhost"
        connect()
    }
    println(status)
}

反模式:过度使用 let

当 if 更清晰时,不要用 let 包装简单的空值检查。请只在作用域函数确实有帮助时使用它们。

fun main() {
    val name: String? = "Ada"
    // OK
    name?.let { println(it.length) }
    // Equivalent and clearer for trivial cases:
    if (name != null) println(name.length)
}

快速检查

哪个作用域函数会将接收者作为 it 传递给 Lambda 表达式,并且返回 Lambda 表达式的结果?

回顾

let 使用 it,并返回 Lambda 表达式的结果,非常适合空安全转换和限制作用域。run 使用 this,并返回 Lambda 表达式的结果,非常适合调用接收者的多个成员。两者都非常适合表达式风格的代码。

免费开始

用 AI 导师学习 Kotlin — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
51
课程
203

常见问题解答

「let 与 run:转换与作用域」课时是免费的吗?

是的 — 「let 与 run:转换与作用域」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「let 与 run:转换与作用域」这节课中我会学到什么?

使用 let 进行空安全转换,使用 run 执行局部计算。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「let 与 run:转换与作用域」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. apply 与 with:配置并返回
  2. let 与 run:转换与作用域
  3. also:不改变接收者的副作用操作
  4. 选择合适的作用域函数:决策指南
← 返回 Kotlin Academy