9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

viewModelScope.launch { } の Job を公開したくない件

Last updated at Posted at 2021-06-03

発端

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 を公開するかどうかを選択することもできていい感じですね!

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?