発端
viewModelScope.launch { }
を使うときにネストが大きくなるのを避けたいなどの理由で、以下のように =
を使って書くことがあります。
fun buy(item: Item): Job = viewModelScope.launch { // ← return type は Job
// do something
}
しかしながら、不用意に Job
を公開することになるのが若干気になります(気にならない人は気にならないかもしれない)。
かといって =
を使わないと若干不格好な感じがします。
fun buy(item: Item) {
viewModelScope.launch { // ネストが大きくなり、本質的なコードがかすんでしまう
// do something
}
}
どうすればいいか考える
F# という関数型言語には ignore
というものがあって、名前の通り関数の返り値を無視することができます。これを Kotlin の世界でも使うことができれば上記の問題を解決できそうです。
let add x y = x + y
add 2 3 |> ignore // 返り値 を無視する
Kotlin で F# の ignore 相当の関数を作る
アイデアはとても簡単です。何もせず Unit
を返すだけの拡張関数を作ります。
fun <T> T.ignore() = Unit
解決
先程のignore()
を viewModelScope.launch { }
の後ろに書いてあげると... できました 🎉
こうすればネストを最小限にしつつ Job を公開せずに済みます。
fun buy(item: String): Unit = viewModelScope.launch { // ← return type が Unit になった!
// do something
}.ignore()
しかも最後に ignore()
をつけるかどうかで Job
を公開するかどうかを選択することもできていい感じですね!