在Kotlin中,函数声明语法允许您在花括号之前写入等号。考虑以下两个例子:
没有=
符号:
fun foo() {
bar()
println("baz")
}
只需调用foo()
即可执行正文中的代码。
=
符号:
fun foo() = {
bar()
println("baz")
}
这里,当调用foo()
时,没有任何反应,但为了让身体被执行,可以写foo()()
。
这两个声明的区别是什么?为什么它们的行为有所不同?
<小时/> 这个问题虽然没有多大意义,但是intentionally asked and answered by the author,因为有些问题已经发布,因为功能定义不正确导致人们出现问题。
答案 0 :(得分:25)
尽管视觉上相似,但这两个声明的想法完全不同。
没有等号的函数声明是Unit
-returning function(类似于Java的void
函数)。
花括号里面的是它的主体,它在函数调用中被执行。可以使用明确指定的Unit
重写该函数:
fun foo(): Unit {
bar()
println("baz")
return Unit
}
Kotlin不要求Unit
的返回语句和显式返回类型 - 返回函数,通常都会省略。
带有等号的函数声明是single-expression function,它的作用就是返回等号右边的内容。
一个更简单的示例:fun getInt() = 1
只是fun getInt(): Int { return 1 }
的缩写形式。
在foo
中,表达式为a lambda,仅返回,未执行。
foo
的返回类型为() -> Unit
,函数本身,因此foo
为higher-order function。
如果没有语法糖和显式类型,foo
可以重写为
fun foo(): () -> Unit {
val result: () -> Unit = { bar(); println("baz") }
return result
}
关于用法,foo
返回的函数可以存储在变量中,传递,以后可以调用:
val f = foo()
f() //equivalent to
f.invoke()
这也是示例中foo()()
执行lambda主体代码的原因。