私は現在、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)
機能しますが、他のすべての組み合わせは機能しません...