8

私は現在、Scala を使用したプロジェクトに取り組んでいますが、Scala の型システムを完全には理解していないようです :-/

次のような状況があります。

def reviews(id: Int) = Action { implicit request =>
  Ok(html.products.reviews(
    reviewlist,
    reviewlist
      .find(review => review.id == id)
      .getOrElse(reviewlist.headOption)
  ))
}

残念ながら、コンパイラは Product を Option[Review] に変換できないと言うので、コードを変更しました

reviewlist
  .find(review => review.id == id)
  .getOrElse(reviewlist.headOption)

id match {
  case 0 => reviewlist.headOption
  case id => reviewlist.find(review => review.id == id)
}

たとえば、無効なレビューIDが送信された場合、最初のレコードが表示されなくなります。その後、利用可能なレビューがまだないふりをします。

次に、問題を非常に単純なサンプルに分解しました。

val a: Option[Int] = Some(1).getOrElse(Some(1))

では、なぜ右側の式が Option[Int] 型ではないのか、誰にもわかりませんか?? Some(1) と None の両方が Option から直接継承され、この式は実際には Some(1) であるか、間違っていますか?

興味深いことに

val a: Option[Int] = None.getOrElse(None)

機能しますが、他のすべての組み合わせは機能しません...

4

3 に答える 3

9

の型シグネチャOption.getOrElse

getOrElse[B >: A](default: ⇒ B): B

つまり、 を呼び出すgetOrElseOption[A]、 型のものを返そうとしますA。default( B) の型が と同じでない場合、 andAの最も近い共有先祖を探します。あなたの場合、andはandです。コンパイラができる最善のことは.ABABOption[Int]IntAny

于 2013-07-09T21:51:21.017 に答える