首页 > 解决方案 > “如果最后一个参数 lambda 被传递给括号外的函数调用,则不允许为默认参数传递任何值”

问题描述

我正在阅读 Kotlin 文档的默认参数部分,并且遇到了以下信息块:

但是,如果最后一个参数 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

我收集他们说不需要传入第三个参数?

标签: lambdakotlin

解决方案


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

下面的原始答案。


您需要前一句的上下文和代码块才能理解:

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

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 的语法仅限于作为 function 的最后一个参数的lambda ,因此编译器可以确定您正在尝试qux在第二个示例中传入。


推荐阅读