Kotlin:调用程序主体中的函数param实现 fun lazyProperty(初始值设定项:()->Int):Int{ val结果:Lazy=Lazy(初始值设定项) 返回result.value } funmain(args:Array){ // 1. val bar:Int=lazyProperty({1+1}) // 2. val foo:Int=lazyProperty(){ 42 } println(“bar$bar,foo:$foo”) }

Kotlin:调用程序主体中的函数param实现 fun lazyProperty(初始值设定项:()->Int):Int{ val结果:Lazy=Lazy(初始值设定项) 返回result.value } funmain(args:Array){ // 1. val bar:Int=lazyProperty({1+1}) // 2. val foo:Int=lazyProperty(){ 42 } println(“bar$bar,foo:$foo”) },kotlin,function-parameter,Kotlin,Function Parameter,我最近偶然发现了在Kotlin中调用函数的语法,我就是不明白: 第一个选项很清楚——它是一个lambda,但第二个选项看起来不像是使用所需参数调用函数的常用语法。通常应该放置参数的括号是空的,而函数参数出现在调用者的主体中!这是如何可能的,需要它做什么?这是传递lambda的另一种有效方式。根据报告: 在Kotlin中,有一种约定,即如果函数的最后一个参数是函数,并且要将lambda表达式作为相应的参数传递,则可以在括号外指定它: 您可以选择您喜欢的方法。这是传递lambda的另一种有效方法。根

我最近偶然发现了在Kotlin中调用函数的语法,我就是不明白:
第一个选项很清楚——它是一个lambda,但第二个选项看起来不像是使用所需参数调用函数的常用语法。通常应该放置参数的括号是空的,而函数参数出现在调用者的主体中!这是如何可能的,需要它做什么?

这是传递lambda的另一种有效方式。根据报告:

在Kotlin中,有一种约定,即如果函数的最后一个参数是函数,并且要将lambda表达式作为相应的参数传递,则可以在括号外指定它:


您可以选择您喜欢的方法。

这是传递lambda的另一种有效方法。根据报告:

在Kotlin中,有一种约定,即如果函数的最后一个参数是函数,并且要将lambda表达式作为相应的参数传递,则可以在括号外指定它:


你可以选择你喜欢的方法。

这只是惯例。如果函数的最后一个参数是函数,则可以将lambda传递到括号外。在您的情况下,您有以下选项:

lock (lock) {
    sharedResource.operation()
}
这三个选项都是相同的


如果函数有第二个参数(在第一个位置),则调用可能如下所示:

val bar: Int = lazyProperty({ 1 + 1 })
val bar: Int = lazyProperty() { 1 + 1 }
val bar: Int = lazyProperty { 1 + 1 }
fun lazyProperty(x: Int, initializer: () -> Int): Int {...}

val bar: Int = lazyProperty(7, { 1 + 1 })
val bar: Int = lazyProperty(7) { 1 + 1 }

如果您的函数有第二个参数(位于第二个位置),则调用可能如下所示:

val bar: Int = lazyProperty({ 1 + 1 })
val bar: Int = lazyProperty() { 1 + 1 }
val bar: Int = lazyProperty { 1 + 1 }
fun lazyProperty(x: Int, initializer: () -> Int): Int {...}

val bar: Int = lazyProperty(7, { 1 + 1 })
val bar: Int = lazyProperty(7) { 1 + 1 }

因此,始终尝试将Lambda保持在函数的最后位置。

这只是惯例。如果函数的最后一个参数是函数,则可以将lambda传递到括号外。在您的情况下,您有以下选项:

lock (lock) {
    sharedResource.operation()
}
这三个选项都是相同的


如果函数有第二个参数(在第一个位置),则调用可能如下所示:

val bar: Int = lazyProperty({ 1 + 1 })
val bar: Int = lazyProperty() { 1 + 1 }
val bar: Int = lazyProperty { 1 + 1 }
fun lazyProperty(x: Int, initializer: () -> Int): Int {...}

val bar: Int = lazyProperty(7, { 1 + 1 })
val bar: Int = lazyProperty(7) { 1 + 1 }

如果您的函数有第二个参数(位于第二个位置),则调用可能如下所示:

val bar: Int = lazyProperty({ 1 + 1 })
val bar: Int = lazyProperty() { 1 + 1 }
val bar: Int = lazyProperty { 1 + 1 }
fun lazyProperty(x: Int, initializer: () -> Int): Int {...}

val bar: Int = lazyProperty(7, { 1 + 1 })
val bar: Int = lazyProperty(7) { 1 + 1 }

因此,请始终尝试将Lambda保持在函数的最后一个位置。

还请注意,如果函数只有一个函数参数,则可以省略括号:
lazyProperty{42}
还请注意,如果函数只有一个函数参数,则可以省略括号:
lazyProperty{42}