2014-07-17 11 views

Trả lời

7

Nếu bạn muốn xác định loại Option bạn có thể sử dụng:

None: Lựa chọn [Chuỗi]

Dấu hai chấm là chú thích loại rõ ràng.

1

Bạn có thể với scalaz:

import scalaz._ 
import Scalaz._ 

none[String] // res0: Option[String] = None 
+0

Tôi biết bạn viết, quan điểm của tôi là liệu tôi có thể chỉ định loại là Không thích: val a: None [String] = – jinglining

8

Option là một kiểu tham số và được định nghĩa như vậy:

... sealed abstract class Option[+A] ... 

nó đang được mở rộng bởi 2 lớp khác:

final case class Some[+A](x: A) extends Option[A] 

case object None extends Option[Nothing] 

Trong khi Some có thể lấy bất kỳ loại đối số nào, None là trường hợp đặc biệt/singleton của một số Option được tham số hóa với Nothing. Hơn nữa Option là biến thể trong đối số loại [+A] có nghĩa là Option[Nothing] có thể được sử dụng ở bất kỳ nơi nào Option với bất kỳ loại đối số nào khác được mong đợi, vì Nothing mở rộng tất cả các loại trong Scala. Vì vậy, không cần tạo bất kỳ giá trị nào khác để biểu thị giá trị Nothing, một singleton None sẽ là đủ cho tất cả các trường hợp.

Về mặt mở rộng Option là lớp trừu tượng được niêm phong, vì vậy bạn không thể mở rộng nó. Bạn không thể mở rộng các lớp con của nó SomeNone vì chúng là các lớp chữ hoa chữ thường.

Thông thường bạn thậm chí không cần phải cố gắng viết một cái gì đó như None[String] vì loại cụ thể hơn Option được định nghĩa ở đâu đó trong ngữ cảnh. Ví dụ, như một đối số chức năng:

def f(o: Option[String]) = ...; f(None) 

hoặc là một sàng lọc:

val o: Option[String] = None 

Hơn nữa, bạn thực sự không quan tâm những gì gõ một lựa chọn là nếu đó là một giá trị Nothing, bạn có thể không nhận được bất cứ điều gì ra khỏi nó anyway, nó giống như một null trong Java nhưng với hành vi Monadic.

Nó được đề cập rằng bạn có thể làm điều gì đó tương tự trong scalaz: none[String]. Đây chỉ là một đường cú pháp, mặc dù rất thuận tiện, để giảm độ trong suốt trong một số trường hợp các loại phải được chú thích.Nó được định nghĩa như vậy:

final def none[A]: Option[A] = None 
+0

Cảm ơn những gì bạn viết – jinglining

+0

@Aleksey Izmailov: Phương thức 'none' của bạn đã tồn tại trong thư viện chuẩn:' Tùy chọn .empty'. –

+0

nó không phải là phương pháp của tôi, tôi đã sao chép 'none' từ scalaz;) –

26

Tôi ngạc nhiên là không ai đề cập đến sự tồn tại của Option.empty:

scala> Option.empty[String] 
res0: Option[String] = None 

Lưu ý rằng trong nhiều trường hợp chỉ đơn giản là sử dụng None nơi một Option[String] dự kiến ​​sẽ hoạt động tốt. Hoặc nói cách khác, (như thể hiện bởi Aleksey Izmailov), sau đây là corrrect:

def f(o: Option[String]) = ...; f(None) 

Điều này là do None kéo dài Option[Nothing], vì vậy nhờ Option là hiệp biến (và Nothing là một sub-type của mỗi loại khác), None luôn tương thích với Option[T] cho bất kỳ T nào.

Đây cũng là lý do tại sao kiểu gán ghép cũng là một lựa chọn tốt (đối với trường hợp bạn cần phải rõ ràng về các loại tùy chọn, bằng ví dụ nếu nó là cần thiết để lái xe loại suy luận):

scala> None: Option[String] 
res0: Option[String] = None 
+0

+1 cho 'rỗng' - không thực sự khác nhiều so với scalaz –

+0

Có 'Option.empty [Type]' là phương pháp hay nhất. Tương tự như vậy cho các danh sách trống và như vậy nên làm 'List.empty [Type]' – samthebest

+0

@samthebest Có lý do tại sao 'Option.empty' là tốt hơn so với chú thích loại rõ ràng? Chỉ cần tò mò – acjay

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