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

前言

使用Kotlin时对有些函数的参数很迷糊,似懂非懂,比如下面的

fun doSomething(callback: () -> Any) {
    val r = callback() // 调用回调,拿到返回值
    println(r)         // 打印结果
}

使用

doSomething {
    "Hello from callback"
}
// 输出:Hello from callback

或者

doSomething {
    42
}
// 输出:42

对于参数callback: () -> Any和上面调用方式看上去很迷惑,今天简单整理一下,方便自己查阅。

正文

下面先对

callback: () -> Any

其中的()和Any简单介绍一下。

()

空参数列表
无参

显示常见的函数参数

写法含义
() -> Any无参,返回 Any
(Int) -> Any一个 Int 参数,返回Any
(String, Int) -> Boolean两个参数,返回 Boolean

Any

`Any`不是“不确定”,而是“最宽松”,可以返回任意值

Any是 Kotlin 的“根类型”,类似 Java 的 Object

所以当你写:

() -> Any

等于:

我不管你具体返回啥,反正我能接住它

参数

回到callback: () -> Any做参数时

fun doSomething(callback: () -> Any) {
    val r = callback()
    println(r)
}

调用的时候,你传的那个 lambda,就是 callback本身:

doSomething {
    "我其实是个 String"
}

等价于:

val callback: () -> Any = {
    "我其实是个 String"
}
val r = callback()
println(r)

所以:lambda 的“最后一行” = callback()的返回值

注意

即使你写:

doSomething {
    println("hi")
    42
}

✅ 返回值是 42

❌ 不是 Unit,也不是 println的结果

因为 lambda 的返回值 = 最后一行表达式的值

参考文字

  1. AI

相关文章

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

暂无评论

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

none
暂无评论...