0

Play2とreactivemongoを使用して、mongodbで利用可能なスラッグを見つけようとしています。次の再帰的な方法を思いつきました。

  private def findSlug(base: String, index: Int): String = {
    val slug: String = Slug({
      base + "-" + index
    })
    for {
      user <- findOne(BSONDocument("slug" -> slug))
    } yield {
      user match {
        case None => slug
        case Some(user) => findSlug(base, index+1)

      }
    }
  }

次のエラーが表示されます

found   : scala.concurrent.Future[String]
required: String
        user <- findOne(BSONDocument("slug" -> slug))
             ^

戻り値の型を変更したり、yield の結果をマッピングしたりするなど、いろいろ試しましたが、もっと単純で簡潔で正しい解決策があるのではないかと思います。要するに、別の非同期関数を呼び出す再帰関数があるということです。

findSlug の戻り値の型を Future[String] に変更すると、

[error]  found   : scala.concurrent.Future[String]
[error]  required: String
[error]         case Some(user) => findSlug(base, index+1)
[error]                                    ^

正しい慣用的な解決策は何でしょうか?

4

1 に答える 1