2017-07-19 3 views
0
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") 
} 

の体内で機能-のparam実装: 拳オプションが明確である - それはラムダです、 2番目の引数は、必要なパラメータを持つ関数を呼び出す通常の構文とは異なります。通常のparamsを置くべき大括弧は空であり、代わりにfunction-parameterが呼び出し側の本体に入っています!どのようにそれが可能で、何のために必要なのですか?Kotlin:私は最近、Kotlinで関数を呼び出す構文つまずいたと私はちょうどそれを得ることはありません、呼び出し元

答えて

3

これはラムダを渡す別の有効な方法です。 docsによると:

Kotlinには、関数の最後のパラメータは関数であり、あなたが対応する引数としてラムダ式を渡している場合、あなたは括弧の外にそれを指定することができるという慣習があります:

lock (lock) { 
    sharedResource.operation() 
} 

あなたが好む方アプローチを選択することができます。

+3

関数に関数パラメータが1つしかない場合は、カッコを省略することもできます: 'lazyProperty {42}' – hotkey

1

これは単なる慣習である。関数の最後のパラメータが関数の場合、ラムダをカッコの外側に渡すことができます。あなたの場合、次のオプションがあります:

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

3つのオプションはすべて同じです。


の呼び出しは次のようになりますよりも、あなたの関数は、(最初​​の位置で)二番目のパラメータを持っている希望の場合:

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) 

したがって、ラムダを最後の位置あなたの機能のイオン。

関連する問題