我可以使用lambda的名称作为“括号外”传递的参数吗?

我可以在括号外写一个lambdaexpression式,但是我不能把它放在名字旁边。 我尝试了很多方法:

val plus3: (Int,Int,Int)->Int = {a,b,c->a+b+c} println(apply3(1,2,3){a,b,c->a+b+c}) // OK println(apply3(1,2,3){plus3}) // Type mismatch. Required: Int, Found: (Int,Int,Int)->Int println(apply3(1,2,3){(plus3)}) // Type mismatch. Required: Int, Found: (Int,Int,Int)->Int println(apply3(1,2,3)plus3) // unresolved reference println(apply3(1,2,3){plus3()}) // value captured in a closure println(apply3(1,2,3){(plus3)()}) // value captured in a closure 

在那里放置一个名字的语法是什么(在括号之外)?

我不知道为什么,但在文档中没有关于主题的文字。 它说,我们可以把lambda放在那里,但不是关于表示lambda的variables或常量。

我不知道为什么,但在文档中没有关于主题的文字。

就在这里:

在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数, 并且将一个lambdaexpression式作为相应的参数传递 ,则可以在括号外指定它

plus3是一个标识符,而不是一个lambdaexpression式,所以你不能在括号外指定它。

plus3的types是(Int,Int,Int-> Int)。 与{a,b,c-> a + b + c}相同。 再看看我从Kotlin编译器得到的消息。

你是指通过{ plus3 }时的错误信息? 按照Kotlin规则{ plus3 }是一个忽略它的参数(如果有的话)并返回plus3 。 所以规则适用, apply3(1,2,3){plus3}意思与apply3(1,2,3,{plus3})

它将plus3视为Int。

完全相反:它期望看到一个Int作为lambda的返回值,并且看到plus3(Int,Int,Int) -> Int

所以,这里的问题不是高度的哲学性,而是纯粹的句法。

这正是我的观点:规则是纯粹的语法,它在编译器知道plus3types或值之前plus3 ,所以它不知道或在意这个值是否是lambda。

相反的规则可以

在Kotlin中,有一个约定,如果函数的最后一个参数具有函数types,则可以在括号外指定它

在这种情况下, apply3(1,2,3) plus3会起作用。 但事实并非如此。

将一个lambdaexpression式放在一个函数调用的圆括号之外与把它放在括号里面是一样的:

 println(apply3(1, 2, 3, { a, b, c -> a + b + c })) 

从这里,我们可以简单地将lambda分配给一个val (如你所做的那样),结果如下:

 val plus3: (Int, Int, Int) -> Int = { a, b, c -> a + b + c } println(apply3(1, 2, 3, plus3))