📘

for 内包表記内で Futre[Bool] の結果でエラーにする処理を見やすくする

2024/01/25に公開

Scala で次のようなコードに遭遇しました.

for {
 result <- FutureBoolFunction
 hogehoge <- if (result) {
   for {
     a <- FutureSomeFunc1
     b <- FutureSomeFunc2
     ...
   } yield fugafuga
 } else {
   Future.failed(new Exception("error"))
 }
} yield hogehoge

この処理は

  1. FutureBoolFunction の結果を受け取る
  2. if で結果を評価する
  3. true の場合は for 内包表記をネストして処理を続行する
  4. else の場合は Failure にする

続投する処理が内包表記でネストしています。この場合

for {
 result <- FutureBoolFunction
 _ <- if (result) {
   Future.unit
 } else {
   Future.failed(new Exception("error"))
 }
 a <- FutureSomeFunc1
 b <- FutureSomeFunc2
  ...
} yield hogehoge

と書けば解決します。

関数を定義する

毎度 if-else でやると面倒なので関数を定義します。

def when(cond: Boolean)(a: => Future[Unit]): Future[Unit] = if (cond) a else Future.unit

when を使うとこのようにかけます。

for {
 result <- FutureBoolFunction
 _ <- when (!result) { Future.failed(new Exception("error"))}
 a <- FutureSomeFunc1
 b <- FutureSomeFunc2
  ...
} yield hogehoge

だいぶスッキリしました。:)

Discussion