为什么这个 Kotlin 函数定义在返回类型之前有一组额外的空括号?

Why does this Kotlin function definition have an extra empty set of parentheses before the return type?

提问人:savedR 提问时间:10/1/2023 更新时间:10/1/2023 访问量:49

问:

我正在浏览 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 函数定义心智模型中有意义?

函数 Kotlin 参数 return-type

评论

0赞 Sweeper 10/1/2023
在该 Codelab 的早期,有 .你明白那段代码的含义吗?这里也是一样。val treat: () -> Unit = { println("Have a treat!") }()
0赞 Tenfour04 10/1/2023
阅读 Kotlin 文档 kotlinlang.org/docs/lambdas.html#higher-order-functions 的本页
1赞 yacc 10/1/2023
这回答了你的问题吗?Kotlin:何时以及如何使用 Lambda 表达式
0赞 savedR 10/2/2023
@Sweeper 啊,是的,当它在那里时,我认为这意味着我们放入“treat”的函数没有参数,实际上它也没有回报,因为这只是“-> 单位”。这对我来说看起来很奇怪,因为它是 trickOrTreat() 的返回,而不是像这样的函数声明的第一位。

答:

0赞 ndc85430 10/1/2023 #1

该函数的返回类型为 。箭头表示它是一个函数。箭头前的括号表示函数不带参数,箭头后面的括号表示函数返回 .() -> UnitUnitUnit

需要明确的是,它本身返回一个函数,其返回类型如我上面所述。trickOrTreat

评论

0赞 savedR 10/2/2023
所以整个构造 '() -> Unit' 是 trickOrTreat() 将要返回的函数的替身?该函数将没有任何参数,因为这些括号是空的,而 Unit 是这个内部函数的返回类型吗?但实际上,整个内部函数是 trickOrTreat() 返回的东西,是吗?因此,如果 trickOrTreat() 返回的内部函数有参数,那么那组括号中会有一些东西,不会存在。
0赞 user2340612 10/2/2023
trickOrTreat返回“一个不带参数并返回的函数(又名它不返回任何内容)”。在第 4 节中,它显示了实现是什么,但基本上它返回一个输出常量字符串的函数——所以一个不带参数且不返回任何内容的函数,因为返回Unitprintln(...)Unit