最近在 portal.kotlin-academy.com/#/ 上看到很多关于 Kotlin 的有趣的题目。个人觉得很适合 Kotlin 爱好者,感兴趣的小伙伴可自行查阅。
【有趣的 Kotlin 】系列记录自己对每一题的理解。
0x04:Lambda runnables
fun run() {
val run: () -> Unit = {
println("Run run run!")
}
object : Runnable {
override fun run() = run()
}.run()
}
fun main(args: Array<String>) {
run()
}
复制代码
以上代码,运行结果是什么?可选项:
- “Run run run!”
- Doesn’t compile
- StackOverflowError
- None of the above
思考一下,记录下你心中的答案。
分析
重点关注
fun run() {
val run: () -> Unit = {
println("Run run run!")
}
object : Runnable {
override fun run() = run()
}.run()
}
复制代码
最外层 run() 和 main() 是一个层级,皆为文件内函数,也就是静态函数。
run() 中定义了一个变量
val run: () -> Unit = {
println("Run run run!")
}
复制代码
run 变量是类型为() -> Unit 的函数类型变量。
同时,还定义了一个匿名对象
object : Runnable {
override fun run() = run()
}.run()
复制代码
定义一个实现 Runnable 接口的匿名对象,并调用其 run() 方法。而 Runnable 接口里的 run() 方法实现是调用的前面的 run 函数类型变量。
梳理清楚题目每一处 run 的含义,问题就会迎刃而解。

那么,从函数执行的入口 main 函数开始,执行顺序如下:
喜欢就支持一下吧
相关推荐


















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)


![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)