lambda - “如果最后一个参数 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
我收集他们说不需要传入第三个参数?
解决方案
更新:文档现已更新,希望新的措辞更加清晰。
下面的原始答案。
您需要前一句的上下文和代码块才能理解:
如果默认参数在没有默认值的参数之前,则只能通过使用命名参数调用函数来使用默认值:
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
在第二个示例中传入。
推荐阅读
- python - 网络爬虫无法在 Youtube 上运行
- drop-down-menu - 在 Yii2 中包含 where 语句时,下拉列表会抛出太少的 args 错误
- c++ - C ++媒体流的N-API连续回调
- wpf - 在 WPF API 客户端登录记住我
- c# - 检测选项卡更改事件
- ruby - 当我遵循 Ruby rubocop 样式指南并使用 .zero 时方法失败?而不是 == 0
- java - API 请求只能从 1 个 IP 地址发出
- angularjs - 在 Angular js 中显示验证错误消息
- windows - 查找在批处理脚本中运行时发生的位置或行错误?
- python - 如何在 REST 中发布多个条目