Kotlin - 括号外的 lambda 参数

问题描述 投票:0回答:1

具有以下功能

fun functionOne(element: Int, func1: (index: Int) -> Unit) {
    println("element=$element")
    func1(element)
}

我可以这样称呼它:

functionOne(element = 123, func1 = {index -> println("index: $index")})

没有编译器抱怨

functionOne(123,  {index -> println("index: $index")})

现在编译器建议

Lambda argument should be moved out of parentheses

functionOne(123) { index -> println("index: $index") }

没有抱怨

但是,除非我没有弄对,否则这种行为仅限于一个 lambda 参数,即具有

fun functionTwo(element: Int, func1: (index: Int) -> Unit, func2: (index: Int) -> Unit) {
    println("element=$element")
    func1(element)
    func2(element)
}

我可以这样打电话

functionTwo(123, { index -> println("index: $index")},  { index -> println("index2: $index")})

但是这个不能编译

functionTwo(456) {index -> println("index: $index"} { index -> println("index2: $index")})

您能否确认一下,或者让我知道将 lambda 参数移出括号

谢谢!

kotlin lambda
1个回答
4
投票

根据文档,只有尾随 lambda 可以放在括号之外:

传递尾随 lambda

根据 Kotlin 约定,如果函数的最后一个参数是函数,那么作为相应参数传递的 lambda 表达式可以放在括号之外:

val product = items.fold(1) { acc, e -> acc * e }

这种语法也称为 trailing lambda

如果 lambda 是该调用中的唯一参数,则可以完全省略括号:

run { println("...") }

这意味着您无法将倒数第二个 lambda 表达式移出括号,因此您无法将多个 lambda 表达式移出括号。

© www.soinside.com 2019 - 2024. All rights reserved.