记录一下Kotlin中遇到Lambda语法糖的问题或疑惑点,简单记录于此,方便自己查阅。
正文
直接看代码
//代码定义 fun launchTask( name: String, block: suspend CoroutineScope.() -> Unit ) //函数调用 TaskManager.launchTask("sync") { while (true) { delay(2000) } }
问题是:
为什么
launchTask明明有两个参数,这里却只传了一个"sync"
从上代码可以知道launchTask()中有两个参数:
name: Stringblock: suspend CoroutineScope.() -> Unit
但调用时只写了:
launchTask("sync") { ... }原因: 这个是Kotlin 的“Lambda 放在括号外”的语法糖
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

