提问人:savedR 提问时间:10/1/2023 更新时间:10/1/2023 访问量:49
为什么这个 Kotlin 函数定义在返回类型之前有一组额外的空括号?
Why does this Kotlin function definition have an extra empty set of parentheses before the return type?
问:
我正在浏览 Google 的 Kotlin Codelab 之一。我在 Android 基础知识下使用 Compose >构建应用程序 UI > Kotlin 基础知识下的 Kotlin 基础知识,我在第 5 节“在 Kotlin 中使用函数类型和 lambda 表达式”中。
我转到了 Codelab 5 的第 4 节“使用函数作为数据类型”。第 3 步让你用以下行定义一个函数 trickOrTreat():
fun trickOrTreat(isTrick: Boolean): () -> Unit {
但是,第二组空括号有什么用呢?
我明白了这其中的所有其他部分。“fun”是函数的关键字,“trickOrTreat”是名称。然后第一组括号是这个函数的参数,其中有一个参数,“isTrick”,类型为 Boolean。然后,冒号表示您将要指定函数的返回类型。但是在此之前的空括号集是什么。是第二个参数吗?为什么在我见过的所有其他函数定义中,您指定返回类型,它们不存在,只有 -> Type,然后是表示函数主体代码开头的左大括号?
我无法弄清楚它们在那里是为了什么,而且他们从来没有说过,当然不是在那堂课上,他们第一次这样使用它们。我什至用谷歌搜索过它,就像“kotlin ”() ->“' 一样笼统,我无法弄清楚这是什么。
而且,我知道它必须在那里!当我没有在 Kotlin Playground 的课程代码中输入它们时,我第一次注意到了这一点,因为据我所知,你不应该这样做,这个函数已经定义了参数。我的代码不起作用。在非常仔细地重读了这节课后,我终于找到了它们;但是,如果我自己要使用它们,我需要了解它们为什么在那里?
我所知道的是,如果它们在那里,它就可以工作,如果它们不存在,它就不会编译,谷歌和 kotlinlang.org 都不会告诉我为什么。它们为什么在那里,它们有什么用,为什么如果它们存在,编译就会起作用,如果它们不存在,就会中断?如何使它们在我的 Kotlin 函数定义心智模型中有意义?
答:
该函数的返回类型为 。箭头表示它是一个函数。箭头前的括号表示函数不带参数,箭头后面的括号表示函数返回 .() -> Unit
Unit
Unit
需要明确的是,它本身返回一个函数,其返回类型如我上面所述。trickOrTreat
评论
trickOrTreat
返回“一个不带参数并返回的函数(又名它不返回任何内容)”。在第 4 节中,它显示了实现是什么,但基本上它返回一个输出常量字符串的函数——所以一个不带参数且不返回任何内容的函数,因为返回Unit
println(...)
Unit
评论
val treat: () -> Unit = { println("Have a treat!") }
()