Kotlin:调用者体内的函数参数实现

fun lazyProperty(initializer: () -> Int): Int { val result: Lazy = lazy(initializer) return result.value } fun main(args: Array) { // 1. val bar: Int = lazyProperty({ 1 + 1 }) // 2. val foo: Int = lazyProperty() { 42 } println("bar $bar, foo: $foo") } 

我最近偶然发现了在Kotlin中调用一个函数的语法,我只是不明白:第一个选项是清晰的 – 这是一个lambda,但是第二个看起来不像通常的调用具有所需参数的函数的语法。 通常应该放置params的括号是空的,而函数参数来自调用者的主体! 这怎么可能,需要什么?

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

在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且将一个lambdaexpression式作为相应的parameter passing,则可以在括号外指定它:

 lock (lock) { sharedResource.operation() } 

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

这只是惯例。 如果一个函数的最后一个参数是一个函数,那么可以将括号外的lambda传递给它。 在你的情况下,你有以下选择:

 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 } 

如果你的函数有第二个参数(在第二个位置),比调用看起来像这样:

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

所以总是尽量保持Lambda在你函数的最后位置。