为什么 lambda “var a: ()->Int = {()->5};” 给出错误 “Expected no parameters”?

Why does the lambda "var a: ()->Int = {()->5};" give the error "Expected no parameters"?

提问人:Sanja 提问时间:10/25/2023 最后编辑:LaurelSanja 更新时间:11/1/2023 访问量:66

问:

为什么这是不正确的:

var a: ()->Int = {()->5};

这是:

var a: ()->Int = {5};

对于第一个,我在 Android Studio 中收到错误:预期没有参数。 我不明白为什么,因为我有空括号。我在 Android Studio 中做了类似的事情,错误是预期为我提供了一个函数的参数,但它收到了,尽管我发送了.()->Unit(Any?)->Unit()->Unit

函数 Kotlin Lambda 参数

评论


答:

1赞 krs 10/26/2023 #1

那么这是怎么回事呢?让我们把它分解成两件事,它的类型和它的实现

var a: () -> Int

这告诉我们变量 a 的类型是“不带参数并返回 Int 的函数”

现在一些适合我们类型的实现。命名函数可能如下所示

fun randomInt(): Int = (0..10).random()

a = ::randomInt 

这将起作用,因为 randomInt 是一个不带参数并返回 Int 的函数。

让我们做一个匿名函数,

a = fun(): Int { return (0..10).random() }

这也将起作用,因为我们的匿名函数不接受任何参数并返回一个 Int。

最后是lambda。

a = { () -> (0..10).random() }

这行不通!?是的。。命名函数和匿名函数确实使用空 () 作为参数,它应该始终存在。没有参数的 lambda 实际上没有,它们只是没有参数列表。

a = { -> (0..10).random() }

但是,如果我们没有任何参数,我们也可以省略箭头。

a = { (0..10).random() }

tldr:() 仅在定义不带参数的函数类型时使用,在创建该函数的 lambda 表达式中不使用。

评论

0赞 krs 10/26/2023
您可以执行 Lambda Like 或 Lambda,但由于最后一个参数是 lambda,因此您可以将其放在括号之外,现在括号为空,因此可以省略someFunction(::functionWithMatchingType)someFunction({returnValue})someFunction() {returnValue}someFunction {returnValue}
0赞 krs 10/31/2023
@gidds谢谢!我刚开始学习 kotlin,可能应该阅读文档。
0赞 gidds 11/1/2023
我确实应该这样做!我将发布我的评论的修订版本,而不会出现严重的错误......
0赞 gidds 11/1/2023
很好的答案,但有一个吹毛求疵:在 Kotlin 中,匿名函数不是 lambda 的同义词,而是类似 or 的表达式。fun(…): ReturnType { ... }fun(…) = ...