Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;如果最后一个参数lambda传递给括号外的函数调用,则不允许传递默认参数的值;_Lambda_Kotlin - Fatal编程技术网

&引用;如果最后一个参数lambda传递给括号外的函数调用,则不允许传递默认参数的值;

&引用;如果最后一个参数lambda传递给括号外的函数调用,则不允许传递默认参数的值;,lambda,kotlin,Lambda,Kotlin,我正在阅读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

我正在阅读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
类型的函数

从他们的解释中我只得到了这些:
但是如果最后一个参数lambda被传递到括号外的函数调用,那么不允许传递默认参数的值

我想他们是说第三个参数不需要传入

但是如果最后一个参数lambda被传递给 括号中,不允许为默认参数传递任何值

这意味着您可以调用
foo
函数,而不需要像这样的括号:

foo { println("hello") } 
or
foo(1) { println("hello") }
or
foo(1, 2) { println("hello") }
带括号的情况如下(请注意,在前两个示例中,我们需要指定参数名称
qux
):


更新:文件已经更新,希望新的措辞更加清晰

原始答案如下


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

如果默认参数位于没有默认值的参数之前,则 默认值只能通过调用名为 论据:

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的语法仅限于lambda,因此编译器可以在第二个示例中发现您试图传入
qux

第四个和第五个示例不起作用,您正在按位置传递一个lambda,用于期望
Int
的参数。谢谢,这很有意义-我现在理解了语法的工作原理。但我只是没有看到一个可行的例子,在哪里可以使用它。有很多情况下,你想把lambda传递给一个函数,有时还想参数化它如何使用它。例如,您可能有一个通常仅使用lambda调用的
execute
函数
execute{println(“foo”)}
,但它有默认参数,您可以在其中调整它执行lambda的方式,例如.g
execute(thread=…,times=3){println(“foo”)}
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