2013-10-21 18 views
11

Bên cạnh việc sử dụng match, có cách Tùy chọn giống như getOrElse nội dung thực tế của giá trị Right hoặc Left không?Nhận giá trị của một trong hai hoặc là

scala> val x: Either[String,Int] = Right(5) 
scala> val a: String = x match { 
           case Right(x) => x.toString 
           case Left(x) => "left" 
         } 
a: String = 5 

Trả lời

9

Tôi không đặc biệt thích Either và kết quả là tôi không khủng khiếp quen thuộc với nó, nhưng tôi tin rằng bạn đang tìm kiếm dự đoán: either.left.getOrElse hoặc either.right.getOrElse.

Lưu ý rằng các phép chiếu cũng có thể được sử dụng để hiểu. Đây là một ví dụ trực tiếp từ các tài liệu:

def interactWithDB(x: Query): Either[Exception, Result] = 
    try { 
    Right(getResultFromDatabase(x)) 
    } catch { 
    case ex => Left(ex) 
    } 

// this will only be executed if interactWithDB returns a Right 
val report = 
    for (r <- interactWithDB(someQuery).right) yield generateReport(r) 
if (report.isRight) 
    send(report) 
else 
    log("report not generated, reason was " + report.left.get) 
+3

Tại sao bạn không thích 'Either'? –

+7

@Kevin đây là ý kiến ​​cá nhân của tôi chỉ, nhưng tôi thấy rằng có hai trường hợp mà nó hữu ích: để trả lại một thất bại hoặc thành công, hoặc trả lại một trong hai kết quả có thể. Trước đây là tốt hơn phục vụ bằng cách sử dụng một 'Try' và sau này chỉ có vẻ như lập trình cẩu thả - Tôi cảm thấy rằng nếu phương pháp của tôi có thể trả về một' String' hoặc 'Date', ví dụ, nó có thể làm với một số refactoring. –

+2

Tôi nghĩ rằng nó hữu ích trong một khuôn khổ xác nhận để trả về thành công hay thất bại. API công khai sau đó sẽ cho bạn biết loại thành công/thất bại nào có thể trả về, ngay cả khi chúng là các lớp tùy chỉnh statefull, trong khi tránh việc sử dụng các ngoại lệ đã kiểm tra. Một ví dụ tôi hiện đang làm việc trên là một khuôn khổ sự kiện tìm nguồn cung ứng, mà sẽ gửi một sự kiện dựa trên một số xác nhận. Đó có thể là loại sự kiện được mong đợi hoặc một số loại "Sự kiện không hợp lệ" – Guillaume

12

câu trả lời Nicolas Rinaudo của liên quan đến gọi getOrElse ở hai chiếu left hoặc right có lẽ là gần nhất với Option.getOrElse.

Ngoài ra, bạn có thể fold sự hoặc là:

scala> val x: Either[String,Int] = Right(5) 
x: Either[String,Int] = Right(5) 

scala> val a: String = x.fold(l => "left", r => r.toString) 
a: String = 5 

Như l không được sử dụng trong các lần ở trên, bạn cũng có thể viết x.fold(_ => "left", r => r.toString)

Edit: Trên thực tế, bạn có thể theo nghĩa đen có Option.getOrElse bằng cách gọi số toOption trên số máy chiếu left hoặc right của một trong hai, ví dụ:

scala> val o: Option[Int] = x.right.toOption 
o: Option[Int] = Some(5) 

scala> val a: String = o.map(_.toString).getOrElse("left") 
a: String = 5 
0

Trong Scala 2.12 có phương thức getOrElse để nhận giá trị "đúng" nhưng bạn không thể sử dụng giá trị "trái" trực tiếp. Tuy nhiên, bạn có thể làm như sau: e.swap.getOrElse(42).

Các vấn đề liên quan