Cả hai loại Unit
và Nothing
cho biết một chức năng không trả về bất kỳ thứ gì. Sự khác nhau giữa chúng là gì?Sự khác biệt giữa Đơn vị và Không có gì?
Trả lời
Unit
là loại có chính xác một giá trị - xem Unit type. Mặt khác, Nothing
có không thể có giá trị - xem Bottom type.
Hàm không trả lại bất kỳ thứ gì phải có kiểu trả về Unit
. Nếu đó là Nothing
thì hàm không thể trả lại kết quả. Cách duy nhất để thoát khỏi hàm sẽ là một ngoại lệ.
Nothing
được sử dụng theo cách khác. Nó được đặc trưng bởi hai thuộc tính:
Nothing
là loại phụ của mọi loại khác (bao gồmNull
).- Không tồn tại trường hợp nào thuộc loại này.
Khi nào điều này hữu ích? Cân nhắc None
:
object None extends Option[Nothing]
Vì Option
là hiệp biến trong tham số kiểu của nó và Nothing
là một subtype của tất cả mọi thứ, Option[Nothing]
là một subtype của Option[A]
cho tất cả các loại A
. Vì vậy, chúng tôi có thể tạo một đối tượng None
là một loại phụ của Option[A]
cho mỗi A
. Điều này là hợp lý, vì Nothing
không thể được khởi tạo nên Option[Nothing]
sẽ luôn không có giá trị. Tương tự như vậy
object Nil extends List[Nothing]
Unit
tương ứng với logic đúng và Nothing
tương ứng với logic sai dưới sự Curry-Howard isomorphism, nơi chúng tôi xem các loại như mệnh đề và có chức năng như chứng minh,.
Unit
có nghĩa là (a) chức năng có các tác dụng phụ như đầu vào và đầu ra, (b) các tác dụng phụ này là mục tiêu chính của hàm. Tất nhiên, chức năng có thể có tác dụng phụ ngay cả khi nó là loại khác nhau từ Unit
.
Nothing
là một loại đặc biệt tại Scala, bởi vì (a) nó không có giá trị (Đơn vị có exectly một giá trị - ()
), vì vậy bạn không thể trở về giá trị của loại Nothing
và (b) nó là một subtype của mỗi loại khác . Điều đó có nghĩa, nếu một cái gì đó có loại Nothing
, nó có thể được sử dụng ở mọi nơi mà loại khác là bắt buộc, nhưng nó sẽ không tạo ra bất kỳ kết quả nào. Điều này được sử dụng để xử lý ngoại lệ - throw
biểu thức có loại Nothing
, do đó, nó có thể được sử dụng về cơ bản ở mọi nơi trong một chương trình.
Đơn giản, Nothing
có nghĩa là đã xảy ra lỗi và không có gì được trả về, trong khi Unit
có nghĩa là đã có tác dụng phụ.
Programming in Scala có giải thích tốt về điều đó.
Để thêm một khía cạnh vào trả lời của Petr: Nothing
đóng một vai trò quan trọng trong phân cấp loại. Đây là loại dưới cùng. Điều đó có nghĩa rằng nó là một loại phụ của mọi loại khác, giống như đối diện của Any
, đó là một kiểu siêu của tất cả mọi thứ. Bạn có thể tìm thấy một lời giải thích tốt đẹp here.
- 1. Có sự khác biệt thực sự nào giữa NUnit và Khung kiểm thử đơn vị của Microsoft (VS 2008) không?
- 2. Sự khác biệt giữa = và: =
- 3. Sự khác biệt giữa $ (...) và `...`
- 4. Sự khác biệt giữa hai xác nhận thử nghiệm đơn vị này là gì?
- 5. Có sự khác biệt nào giữa CGRect và NSRect không?
- 6. Clojure - sự khác biệt giữa '(dấu nháy đơn) và `(backtick)
- 7. Magento - Sự khác biệt giữa Báo giá và Đơn hàng
- 8. Sự khác biệt giữa tính đơn điệu và sự chấp nhận của một heuristic là gì?
- 9. Sự khác biệt giữa. và #
- 10. Sự khác biệt giữa vị trí ruột kết trong: cái gì đó và cái gì đó:
- 11. Sự khác nhau giữa khung kiểm tra đơn vị ScalaTest và Scala Specs là gì?
- 12. Có sự khác biệt nào giữa gluLookAt() và glFrustum() không?
- 13. Sự khác biệt giữa ". +" Và ". +?"
- 14. Sự khác biệt giữa $ * và $ @
- 15. Sự khác biệt chính giữa Sinatra và Ramaze là gì?
- 16. Sự khác biệt giữa "**/* /" và "** /"?
- 17. Sự khác biệt giữa dispatch_get_global_queue và dispatch_queue_create là gì?
- 18. Sự khác biệt giữa fn và fn * là gì?
- 19. Có sự khác biệt nào giữa log4net.Config.BasicConfigurator.Configure() và log4net.Config.XmlConfigurator.Configure() không?
- 20. Sự khác biệt giữa gói android.opengl và javax.microedition.khronos.opengles là gì?
- 21. Sự khác biệt giữa khẳng định và static_assert là gì?
- 22. Sự khác biệt giữa ASP.NET và ASP.NET MVC là gì?
- 23. Sự khác biệt giữa đúc và co giật là gì?
- 24. Có sự khác biệt nào giữa System.Windows.Clipboard và System.Windows.Forms.Clipboard không?
- 25. Sự khác biệt giữa Delphi và Delphi.NET
- 26. Sự khác biệt giữa bytebuffer.flip() và bytebuffer.rewind()
- 27. Có sự khác biệt nào giữa RPC và IPC không?
- 28. Có sự khác biệt nào giữa MsgBox và MessageBox.Show không?
- 29. Có sự khác biệt nào giữa! == và! = Trong PHP không?
- 30. có sự khác biệt giữa/mnt/sdcard và/sdcard không?
@ downvoters: Khi tôi viết câu trả lời này, câu trả lời của Petr không đề cập đến khía cạnh kiểu dưới cùng. Anh ấy chỉ thêm nó sau. – bluenote10