前言

记录一下Kotlin中遇到Lambda语法糖的问题或疑惑点,简单记录于此,方便自己查阅。

正文

直接看代码

//代码定义
fun launchTask(
    name: String,
    block: suspend CoroutineScope.() -> Unit
)
//函数调用
TaskManager.launchTask("sync") {
    while (true) {
        delay(2000)
    }
}

问题是:

为什么 launchTask明明有两个参数,这里却只传了一个 "sync"

从上代码可以知道launchTask()中有两个参数:

  1. name: String

  2. block: suspend CoroutineScope.() -> Unit

但调用时只写了:

launchTask("sync") { ... }

原因: 这个是Kotlin 的“Lambda 放在括号外”的语法糖

Lambda 语法糖

下面是Kotlin中Lambda的语法糖

规则 1

最后一个参数是 Lambda,可以写到括号外面

等价写法:

TaskManager.launchTask("sync", {
    while (true) {
        delay(2000)
        Log.d("Sync", "syncing...")
    }
})

Kotlin 允许你把 最后一个 Lambda 提到括号外

于是变成:

TaskManager.launchTask("sync") {
    while (true) {
        delay(2000)
        Log.d("Sync", "syncing...")
    }
}
规则 2

如果只有 Lambda 一个参数,连括号都能省

比如:

fun run(block: () -> Unit) {
    block()
}

run {
    println("hello")
}

等价于:

run({ println("hello") })

block: suspend CoroutineScope.() -> Unit

这是 带接收者的挂起函数类型

拆开看:

部分含义
suspend可以挂起
CoroutineScope.()接收者是 CoroutineScope
-> Unit无返回值

意思是:

这个 Lambda 在 CoroutineScope 里执行

所以你在 Lambda 里能直接用:

delay(2000)   // 来自 CoroutineScope
launch { }    // 来自 CoroutineScope

参考文字

  1. AI

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...