Tôi tự hỏi nếu tôi có thể viết một cái gì đó như thế này trong mã của tôi:Bạn có thể chỉ định kiểu đối số cho Không hoặc cho trình biên dịch biết rằng đó là một Option [String]?
None[String]
Tôi tự hỏi nếu tôi có thể viết một cái gì đó như thế này trong mã của tôi:Bạn có thể chỉ định kiểu đối số cho Không hoặc cho trình biên dịch biết rằng đó là một Option [String]?
None[String]
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.
Bạn có thể với scalaz:
import scalaz._
import Scalaz._
none[String] // res0: Option[String] = None
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]
và
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ó Some
và None
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
Cảm ơn những gì bạn viết – jinglining
@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'. –
nó không phải là phương pháp của tôi, tôi đã sao chép 'none' từ scalaz;) –
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
+1 cho 'rỗng' - không thực sự khác nhiều so với scalaz –
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
@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
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