为何Kotlin函数trickOrTreat返回类型前有额外空括号?
Kotlin中函数返回类型里的空括号是什么意思?
你看到的()并不是trickOrTreat函数的第二组参数,而是返回的函数类型的参数声明部分,核心原因是这个函数的返回值本身就是另一个函数——Kotlin里函数是一等公民,可以作为参数传递、也可以作为返回值返回。
拆解函数定义的结构
先把fun trickOrTreat(isTrick: Boolean): () -> Unit拆成两部分看:
- 前半段
fun trickOrTreat(isTrick: Boolean):这是普通的函数声明,isTrick: Boolean是trickOrTreat自身的参数。 - 后半段
: () -> Unit:这是trickOrTreat的返回类型,但这个返回类型是一个函数类型,而非Int、String这类普通类型。
函数类型的语法规则
Kotlin里函数类型的语法是(参数类型列表) -> 返回值类型:
- 括号里的内容是这个函数类型接收的参数类型,如果没有参数,就用空括号
()表示; ->后面是这个函数类型的返回值类型,Unit表示该函数没有实际返回值(类似Java的void)。
所以() -> Unit翻译成大白话就是:一个不需要传入参数、执行后也不返回任何值的函数。
为什么不能去掉空括号?
如果去掉空括号写成: -> Unit,完全不符合Kotlin的语法规则——函数类型必须明确声明参数列表(哪怕为空),编译器无法识别残缺的-> Unit是合法类型,自然会编译失败。
如何纳入你的Kotlin函数认知模型?
可以把函数类型当成一种特殊的“数据类型”,和Int、String平级:
- 普通函数返回的是“值”,比如
fun getNumber(): Int返回一个整数; - 而像
trickOrTreat这样的函数,返回的是“一段可执行的代码”,所以需要用函数类型来描述这段代码的参数和返回值规则; - 记住函数类型的固定格式:
(参数类型...) -> 返回值类型,无参数就写(),有参数就把类型列在括号里(比如(Int) -> String表示接收Int参数、返回String的函数)。
举个完整的例子
比如trickOrTreat的实现可能是这样:
fun trickOrTreat(isTrick: Boolean): () -> Unit { return if (isTrick) { // 返回一个Lambda表达式(即符合() -> Unit类型的函数) { println("不给糖就捣蛋!") } } else { { println("谢谢糖果!") } } }
调用的时候,你需要先拿到返回的函数,再执行它:
val action = trickOrTreat(true) action() // 打印:不给糖就捣蛋!
内容的提问来源于stack exchange,提问作者savedR
相关产品推荐
相关产品推荐

