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

时间:2017-07-19 15:57:16

标签: kotlin function-parameter

fun lazyProperty(initializer: () -> Int): Int {                
  val result: Lazy<Int> = lazy(initializer)
  return result.value                   
}                

fun main(args: Array<String>) {                
  //    1.
  val bar: Int = lazyProperty({ 1 + 1 })
  //    2.
  val foo: Int = lazyProperty() {
    42
  }

  println("bar $bar, foo: $foo")
}

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

2 个答案:

答案 0 :(得分:3)

这是传递lambda的另一种有效方法。根据{{​​3}}:

  

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

lock (lock) {
    sharedResource.operation()
}

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

答案 1 :(得分:1)

这只是惯例。如果函数的最后一个参数是函数,则可以在括号外传递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保持在函数的最后位置。