2017-01-12 15 views
11

returnステートメントを省略しても、ラムダの最後の行は常にその値を返すようです。これは正しいです?それはどこに文書化されていますか?Kotlinのラムダからの暗黙の戻り

fun main(args: Array<String>) { 
    val nums = arrayOf(1, 2, 3) 
    val numsPlusOne = nums.map { it -> 
     val r = it + 1 
     r 
    } 
    // numsPlusOne = [2, 3, 4] 
} 
+2

これは 'val numsPlusOne = nums.map {it + 1}'に短縮することができます( 'it'は指定されていなければ暗黙に指定され、' it + 1'は最後の行です。 @hotkeyが説明されているように結果が返されます) –

答えて

24

はい、これは正しいです。ラムダの最後の文が式の場合、戻り値と見なされます。私たちは、明示的qualified return構文を使用してラムダから値を返すことができ

はここwhat the reference says(感謝@KirillRakhman)です。それ以外の場合は、最後の式の値が暗黙的に返されます。したがって、2次のスニペットは等価です:

ints.filter { 
    val shouldFilter = it > 0 
    shouldFilter 
} 

ints.filter { 
    val shouldFilter = it > 0 
    [email protected] shouldFilter 
} 

最後の文の意味if (that's why there's no ternary operator)whentry-catchブロックについても同様であり、これらの文は表現そのものです:

val foo = if (bar) { 
    doSomething() 
    baz 
} else { 
    doSomethingElse() 
    qux 
} 

参照:examples for when and try-catch

したがって、lambdaはこの点で言語構造と一致しています。


あなたは[email protected] syntax(また、another answer with examples)を使用し、ラムダに明示的なreturn文を作成する場合。これに対して、ラベルされていないreturnは、最も近いfun(ラムダを無視する)と共に働き、従って、inlinedであるラムダにおいてのみ生じ得る。

の特別な構文を追加するlanguage proposalがありました。コードブロックからの値はですが、拒否されました。

関連する問題