我正在阅读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
我知道他们是说不需要传入第三个参数?
答案 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") })