この記事では、kotlinのラベル付きreturnについて解説します。
ラムダでreturn
ラベル付きreturnの使いどころを説明するために、まずはラムダで普通のreturnを使ってみます。
kotlinではラベルがついていないreturnの場合は、そこから一番近い(内側の)関数からreturnすることになります。今回の場合は、returnからhogeが最も近い(内側の)関数なので11行目のreturnはhoge関数からreturnされたことになります。ですので、14行目、16行目は実行されないです。
この動きは意図した動きではなく、実際はラムダからreturnしたいですね。このような場合に使うのがラベル付きreturnです。次の章で説明します。
fun main() {
hoge()
}
fun hoge(): Boolean {
println("start of hoge")
var intArray: IntArray = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
intArray = intArray.filter {
val isFiltered = it % 2 == 0
return isFiltered // hoge関数からのreturn
}.toIntArray()
println("end of hoge") // 11行目でreturnされるので、このコードは実行されない
return true
}
ラムダでラベル付きreturn
ラムダ内からreturnしたいときに使うのが、ラベル付きreturnです。これを使うとラベルで指定した場所からreturnすることができます。
暗黙的なラベル(implicit label)
ラベルには暗黙的なラベルと任意のラベル名を付けて使う方法2種類があります。まずは暗黙的なラベルです。
11行目でreturn@filterとなっています。この@filterが暗黙的なラベルで、return@filterがラベル付きreturnです。@の後には、ラムダを渡している関数名を書きます。今回の場合、filter関数にラムダを渡しているので、return@filterとしています。
このようにするとreturnはhoge関数のreturnではなく、ラムダ内からのreturnになるので、16行目のreturnまで実行されます。
fun main() {
hoge()
}
fun hoge(): Boolean {
println("start of hoge")
var intArray: IntArray = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
intArray = intArray.filter {
val isFiltered = it % 2 == 0
return@filter isFiltered //
}.toIntArray()
println("end of hoge")
return true
}
自分でラベルを付ける
実はkotlinではすべての式にラベルを付けることができます。先ほどのコードを自分でラベルを付けるように書き換えてみます。
ラベル名@というフォーマットで任意のラベルを付けることができます。9行目でlblという名前でラベルとつけています。
fun main() {
hoge()
}
fun hoge(): Boolean {
println("start of hoge")
var intArray: IntArray = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
intArray = intArray.filter lbl@{ // 「lbl」というラベルとつけた
val isFiltered = it % 2 == 0
return@lbl isFiltered
}.toIntArray()
println("end of hoge")
return true
}
まとめ
- ラベル付きreturnとはreturn@ラベル名という形式のreturn文
- ラベルには暗黙的なラベルと自分で任意のラベル名を付ける方法がある
- ラムダ内からreturnするときは、ラベル付きreturnを使う