2009-11-24 35 views
6

Cách dễ dàng/gọn gàng hơn để làm điều này là gì?Thành ngữ cho Tùy chọn của Scala khi thực hiện các kiểm tra bình đẳng

val o = Some(4) 
if(o.isDefined) {o.get == 4} else { false } 

Tôi đã thử

o.getOrElse(null) == 4 

nhưng mà cảm thấy sai, vì trong trường hợp isEmpty, bạn kết thúc thử nghiệm rỗng chống lại phía bên kia ... mà có thể bản thân được null. Tôi cần nó là nếu opt được xác định & & opt.get == bất cứ điều gì. Tôi cảm thấy giống như một số phương pháp trên Tùy chọn chỉ cần thực hiện một chức năng và tôi có thể làm như vậy:

o.test((x) => x == 4) 

và nó sẽ chỉ áp dụng chức năng nếu o.isDefined.

+1

trùng lặp chính xác: http://stackoverflow.com/questions/1611872/a-better-way-to-test-the-value-of-an-option - mà , trên thực tế, là câu hỏi "liên quan" đầu tiên được liệt kê. –

+0

Tôi đã không đến khi tôi tìm kiếm. Cảm ơn bạn đã liên kết chúng. – Trenton

Trả lời

7

Điều này có vẻ hợp lý sạch với tôi:

o.map(4==).getOrElse(false) 

Nếu bạn muốn, bạn thậm chí có thể thêm một chuyển đổi ngầm để thêm một phương pháp thuận tiện cho việc này:

implicit def richOption[A](o: Option[A]) = new { 
    def test(p: A => Boolean): Boolean = o.map(p).getOrElse(false) 
} 
+0

Mục đích của '==' sau 4 là gì? –

+0

"' 4 == '" là một hàm kiểm tra tính bình đẳng với 4 –

+0

Đường Scala. 4 == được coi là một hàm ẩn danh của một đối số trong trường hợp này. Rõ ràng hơn (nhưng chi tiết hơn) có thể là: 'o.map (4. ==)' hoặc 'o.map (_ == 4)' hoặc 'o.map (x => x == 4)'. Điểm mấu chốt ở đây là bất cứ điều gì bạn chuyển đến Option.map() chỉ được đánh giá trên các tùy chọn không có. – overthink

5

Làm thế nào về điều này:

val o = Some(4) 
o match { 
    case Some(4) => true 
    case _ => false 
} 
2

Điều sau có vẻ trực quan nhất với tôi, nếu bạn không quan tâm đến việc tạo đối tượng trên quảng cáo.

val o = Some(4) 
Some(4) == o 

Một phương pháp unsuggested

val o = Some(4) 
val Some(x) = o; x==4 // Edit: will not compile of o = None 
+0

Phương thức thứ hai không giải thích được khi o là Không. –

+0

D'oh! Đã chỉnh sửa để phản ánh. Cảm ơn! –

9

Bạn cũng có thể sử dụng:

if (o == Some(4)) //do something 
1
o.map(_ == 4).getOrElse(false) 
12

Đây là cách sạch thành ngữ nhất để làm điều đó.

val o = Some(4) 
o.contains(4) // true 
o.contains(5) // false 

Ngoài ra còn có một phiên bản ngữ về điều này:

val o = Some(4) 
o.exists(_ > 0) // true 
o.exists(_ > 100) // false 

Chỉ sử dụng phiên bản ngữ nếu contains là chưa đủ mạnh.

1

Hãy thử điều này:

val o = Some(4) 
o.exists(4 == _) 
Các vấn đề liên quan