“如果将最后一个参数lambda传递到括号外的函数调用,则不允许传递默认参数的值”

时间:2019-02-23 05:57:35

标签: lambda kotlin

我正在阅读Kotlin文档的Default Arguments部分,并且遇到了以下信息块:

  

但是,如果最后一个参数lambda传递给   括号,不允许传递默认参数的值:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { ... }

foo(1) { println("hello") } // Uses the default value baz = 1 
foo { println("hello") }    // Uses both default values bar = 0 and baz = 1

我试图理解这里所说的话。

我知道前两个参数不需要传递任何值。第三个参数似乎是返回Unit类型的函数。

这就是我从他们的解释中得到的:But if a last argument lambda is passed to a function call outside the parentheses, passing no values for the default parameters is allowed

我知道他们是说不需要传入第三个参数?

2 个答案:

答案 0 :(得分:1)

更新:文档现已updated,希望新的措辞更加清晰。

下面的原始答案。


您需要前一句话的上下文和代码块才能使之有意义:

  

如果默认参数在没有默认值的参数之前,则   默认值只能通过调用具有named的函数来使用   参数:

fun foo(bar: Int = 0, baz: Int) { ... }
​
foo(baz = 1) // The default value bar = 0 is used
     

但是,如果最后一个参数lambda传递给   括号,不允许传递默认参数的值:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { ... }
​
foo(1) { println("hello") } // Uses the default value baz = 1 
foo { println("hello") }    // Uses both default values bar = 0 and baz = 1

因此,在一般情况下,如果除了最后一个参数之外的所有参数都具有默认值,则仅用该参数调用函数时就必须显式命名最后一个参数,因为无法编译器知道您正在尝试传递该特定参数,而不仅仅是传递参数列表上的第一个参数。

但是,由于在函数调用的括号外传递lambda的语法仅限于very last parameter of the function的lambda,因此编译器可以确定您正在尝试传递{{1} }在第二个示例中。

答案 1 :(得分:0)

  

但是,如果最后一个参数lambda传递给   括号,不允许传递默认参数的值。

这意味着您可以在不使用括号的情况下调用foo函数:

foo { println("hello") } 
or
foo(1) { println("hello") }
or
foo(1, 2) { println("hello") }

带有括号的样子(请注意,在前两个示例中,我们需要指定参数名称qux

foo(qux = { println("hello") })
or
foo(1, qux = { println("hello") })
or
foo(1, 2, { println("hello") })