2013-01-13 40 views
15

Có một chức năng được xác định trước x trong Scala kết hợp 2 tùy chọn đểKết hợp 2 lựa chọn vào 1

Some(a) x None => Some(a) 
None x Some(b) => Some(b) 
None x None => None 
+1

gì về khi bạn có 'Một số (a)' và 'Một số (b)'? –

+0

Trường hợp đó không thể xảy ra trong những gì tôi đang làm, vì vậy tôi không quan tâm kết quả là gì. –

Trả lời

39

Vâng, đây là phương pháp orElse. Nó chọn giá trị được xác định đầu tiên, hoặc None nếu không được xác định.

scala> Some(1) orElse None 
res0: Option[Int] = Some(1) 

scala> None orElse Some(1) 
res1: Option[Int] = Some(1) 

scala> None orElse None 
res2: Option[Nothing] = None 

scala> Some(1) orElse Some(2) 
res3: Option[Int] = Some(1) 
3

Nó không khó để làm điều đó bằng tay:

scala> val a = Some(1) 
a: Some[Int] = Some(1) 

scala> val b = Some(2) 
b: Some[Int] = Some(2) 

scala> Seq(a,b).flatten.headOption 
res0: Option[Int] = Some(1) 
+3

Hoặc chỉ '(a ++ b) .headOption'. –

3

Trong những ý kiến ​​câu hỏi, bạn đề cập đến bạn không thể có Some(a)Some(b), vì vậy những gì bạn thực sự phải là Option[Either[Int,Int]]. Trong trường hợp đó, bạn có thể sử dụng x.map(_.merge) để có được trở lại Option[Int], ví dụ:

scala> val x:Option[Either[Int,Int]] = Some(Left(2)) 
x: Option[Either[Int,Int]] = Some(Left(2)) 

scala> x.map(_.merge) 
res0: Option[Int] = Some(2) 
+1

Đây là một điểm rất tốt. Thật đáng ngờ khi sử dụng một loại mà rõ ràng là có những cư dân "không thể xảy ra" –

+0

điều này có thể không hoạt động tốt như vậy mặc dù nếu anh ta có hai hàm 'Option [T]' trở lại, hay đúng không? –

+2

Điểm của tôi là nhiều hơn * nếu * hai trường hợp 'Một số' * không thể * xảy ra, thì tốt hơn nên mã hóa nó trong hệ thống kiểu. Nếu có 2 giá trị 'Option [T]', thì nó phải được giả định rằng cả hai có thể là 'Some'. Câu trả lời của 'orElse' là Ben đã ưu tiên một lựa chọn so với phương án kia, điều này có thể hợp lệ. Sử dụng 'Option [Hoặc [T, T]]' mặc dù loại bỏ sự cần thiết phải đưa ra quyết định đó. –

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