Obecnie pracuję nad projektem z Scala i wydaje się, że nie w pełni zrozumieć Scala system typów: -/Dlaczego niektóre (1) .getOrElse (niektóre (1)) nie typu Opcja [Int]?
Mam następującą sytuację:
def reviews(id: Int) = Action { implicit request =>
Ok(html.products.reviews(
reviewlist,
reviewlist
.find(review => review.id == id)
.getOrElse(reviewlist.headOption)
))
}
Niestety kompilator mówi, że nie można przekonwertować Produkt na wariancie [recenzja], więc zmieniłem kod
reviewlist
.find(review => review.id == id)
.getOrElse(reviewlist.headOption)
z
id match {
case 0 => reviewlist.headOption
case id => reviewlist.find(review => review.id == id)
}
, które wydaje się teraz działać, nawet jeśli nie jest to dokładnie to samo, co na przykład, nie pokazuje już pierwszego rekordu, jeśli przesłano nieprawidłowy identyfikator opinii. następnie będzie udawać, że nie ma jeszcze dostępnych opinii.
I wtedy wybuchła problemu w dół do baaardzo prosty próbki:
val a: Option[Int] = Some(1).getOrElse(Some(1))
Więc ma ktoś jakiś pomysł, dlaczego wyrażenie po prawej stronie nie ma opcji typu [Int] ?? Zarówno niektóre (1) i Brak dziedziczą bezpośrednio z Opcji i to wyrażenie jest w rzeczywistości Niektóre (1) w ogóle, czy też jestem w błędzie?
wystarczająco Interestinly
val a: Option[Int] = None.getOrElse(None)
prace, ale wszystkie inne kombinacje nie ...
'x.orElse (Some (y))' jest zawsze głupie dla dowolnego 'x' i' y'. Chcesz 'x.getOrElse (y)'. –
@pelotom to po prostu [nie jest prawdą] (http://stackoverflow.com/q/14305308/298389) –
Nie mówię, że 'orElse' jest głupie, mówię, że przekazanie mu wartości jawnie zapakowane w' ' Niektóre są głupie. –