stackOverFlawを見ても英語じゃすぐに腑に落ちなかったので、一応。
###return@launchってなんじゃい
androidの公式tutorialをやっていたら、こんな関数にぶつかった。
SleepTrackerViewModel.kt
fun onStopTracking() {
uiScope.launch {
val oldNight = tonight.value ?: return@launch
oldNight.endTimeMilli = System.currentTimeMillis()
update(oldNight)
}
}
"return@launch"ってなんや。
もう少しわかりやすいコードを探すと、
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
####ググった結論
@labelで指定したラムダ処理({~})から脱出(return)できるということだ。
上のコードの場合、@labelをつけなければ、全てのラムダ処理から(最も外側へ)脱出=fun onStopTracking()から脱出する。
#####何が腑に落ちなかったか
返り値のない関数のくせにreturnってどゆこと。
#####ちょっと考えてみた個人的見解(多分合ってる)
returnってそもそも関数や{}から脱出するためのもので、返り値がある関数では、return の後ろについた値を持って帰れる。- (ご指摘を受けての修正)returnの機能は、戻り値を持って関数や{}から脱出する事。但し、返り値が無い関数や{}の末尾のreturn Unitは省略できる。
(*ちなみに、return Unitやreturnをわざわざ書いてもエラーにはならない。)
今までreturnは返り値専用の乗り物だと思ってたもんで、賢くなれたかも。個人的考察で正確じゃないけど。
もっと賢くなれて嬉しいです。@links_2_3_4さん、ご指摘ありがとうございました。