Tôi hiện đang làm việc trên một dự án với Scala và có vẻ như tôi không hoàn toàn hiểu Scala của hệ thống kiểu: -/Tại sao một số (1) .getOrElse (Một số (1)) không thuộc loại Option [Int]?
Tôi có tình huống sau đây:
def reviews(id: Int) = Action { implicit request =>
Ok(html.products.reviews(
reviewlist,
reviewlist
.find(review => review.id == id)
.getOrElse(reviewlist.headOption)
))
}
Thật không may là trình biên dịch cho biết, ông không thể chuyển đổi sản phẩm để lựa chọn [Review], vì vậy tôi đã thay đổi mã
reviewlist
.find(review => review.id == id)
.getOrElse(reviewlist.headOption)
với
id match {
case 0 => reviewlist.headOption
case id => reviewlist.find(review => review.id == id)
}
dường như hoạt động ngay bây giờ, mặc dù nó không chính xác giống như nó, ví dụ, không hiển thị bản ghi đầu tiên nữa nếu id đánh giá không hợp lệ đang được gửi. sau đó nó sẽ giả vờ, rằng chưa có đánh giá nào.
sau đó tôi đã phá vỡ vấn đề xuống một mẫu veeery đơn giản:
val a: Option[Int] = Some(1).getOrElse(Some(1))
Vì vậy, có ai có ý tưởng, tại sao biểu hiện ở bên phải không phải là loại Tùy chọn [Int] ?? Cả hai, một số (1) và không thừa kế trực tiếp từ Option và biểu thức này thực sự là một số (1) trong bất kỳ hoặc tôi là sai?
Interestinly đủ
val a: Option[Int] = None.getOrElse(None)
công trình, nhưng tất cả các kết hợp khác không ...
'x.orElse (Một số (y))' luôn ngớ ngẩn cho bất kỳ 'x' và' y' nào. Bạn muốn 'x.getOrElse (y)'. –
@pelotom nó chỉ đơn giản là [không đúng] (http://stackoverflow.com/q/14305308/298389) –
Tôi không nói 'orElse' là ngớ ngẩn, tôi đang nói rằng truyền nó một giá trị được gói gọn trong' Một số là ngớ ngẩn. –