2015-01-23 17 views
12

Có nhiều người nghĩ rằng khái niệm về giá trị đặc biệt null (vì nó được sử dụng trong lanuages ​​như C, Java, C#, Perl, Javascript, SQL, vv) là một ý tưởng tồi. Có một số câu hỏi về điều này trên SO và P.SE, chẳng hạn như Best explanation for languages without nullAre null references really a bad thing?.Có các ngôn ngữ không có "null" không?

Tuy nhiên, tôi không thể tìm thấy bất kỳ ngôn ngữ nào không có chúng. Tất cả các ngôn ngữ tôi quen thuộc có null hoặc một thứ gì đó tương tự (ví dụ: "không xác định" trong Perl).

Tôi nhận thấy rằng mọi ngôn ngữ đều cần một số cách để thể hiện "sự vắng mặt của một giá trị". Tuy nhiên, thay vì có "null" hoặc "undefined", điều này cũng có thể được thực hiện rõ ràng bằng cách sử dụng một cái gì đó như Maybe (Haskell) hoặc Optional (Ổi). Sự khác biệt chính để có "null" hoặc "undefined" là một đối tượng chỉ có thể có "không có giá trị" nếu nó có một loại cụ thể (Có thể, Tùy chọn ...). Ngược lại, "null"/"undefined" thường là giá trị hợp lệ có thể cho mọi loại.

Có bất kỳ ngôn ngữ nào không có khái niệm "rỗng" hoặc khái niệm tương tự theo ý nghĩa này không?

+0

Con trỏ là ý tưởng tồi, không phải là số không. Trong Perl, không thể tạo một tham chiếu null hoặc một con trỏ lơ lửng. Trong nhiều ngôn ngữ hiện đại, nó cũng không thể tạo ra một con trỏ null hoặc một con trỏ lơ lửng. – shawnhcorey

+0

Trừ khi ngôn ngữ là phạm vi để xử lý các trạng thái hữu hạn, tôi không nghĩ rằng "null" có thể tránh được. Nhu cầu đại diện cho một sự vắng mặt hoặc thiếu thông tin phát sinh khá nhanh chóng. Bạn luôn có thể có giá trị "trống" cho từng loại mà bạn tạo nhưng sau đó sẽ thực tế hơn nếu chỉ có một loại trống phổ biến cho tất cả – Pedrom

+2

Vâng, đề xuất thông thường là làm cho "không có dữ liệu" rõ ràng. Một cái gì đó như 'Có thể' trong Haskell, hoặc 'Tùy chọn' trong ổi. Tôi sẽ chỉnh sửa câu hỏi. – sleske

Trả lời

18

Dưới đây là danh sách ngôn ngữ không đầy đủ mà không có null/undefined/nothing theo nghĩa bạn mô tả, được sắp xếp theo năm xuất hiện đầu tiên theo Wikipedia.

  • Pony (trước-1.0.0). Sử dụng loại liên kết trong đó một trong các loại là None.
  • Crystal (trong giai đoạn alpha): Có nil, nhưng ngăn chặn tất cả ngoại lệ con trỏ null tại thời gian biên dịch.
  • Kotlin (2015): Có các loại tùy chọn với cú pháp ?.
  • Swift (2014): Có các loại tùy chọn với cú pháp ?.
  • Hack (2014): Có các loại tùy chọn với cú pháp ?.
  • Elm (2012): Có loại công đoàn Maybe.
  • Ceylon (2011): Có các loại tùy chọn với cú pháp ?.
  • Rust (2010): Có loại tùy chọn Option.
  • Fantom (2005): Có các loại tùy chọn với cú pháp ?.
  • F# (2005): Có loại công đoàn Option.
  • Nice (2003): Có các loại tùy chọn với cú pháp ?.
  • OCaml (1996): Có loại công đoàn option.
  • Haskell (1990): Có loại công đoàn Maybe.
  • Standard ML (1990): Có loại công đoàn option.
  • Tcl (1988)

Hãy thoải mái để bổ sung cho danh sách.

1

Bạn đã đề cập đến Haskell làm ví dụ về ngôn ngữ không có "null". Ngoài ra còn có các ngôn ngữ trong họ ML như Standard ML, OCaml hoặc F #. Nhiều ngôn ngữ được gõ động cũng không có con trỏ null, lược đồ sẽ là một ví dụ tốt.

+0

Tôi nghĩ rằng điểm chính của câu hỏi không chỉ là con trỏ null, nhưng giá trị null thiếu hạn chế. Vì vậy, Scheme, Common Lisp và Ruby có 'nil', có tất cả các vấn đề tương tự như' null' của Java. Sự khác biệt duy nhất là, nếu bạn đang ở trong một ngôn ngữ động gõ, bạn đã mong đợi để đối phó với những loại vấn đề và có lẽ đã làm kiểm tra thời gian chạy nhiều hơn để tránh chúng. –

2

Tcl không có khái niệm gì về null. Tất cả mọi thứ là một giá trị và tất cả các giá trị có một biểu diễn chuỗi (thường được tóm tắt là "Tất cả mọi thứ là một String").

Điều gần nhất với null là chuỗi rỗng.

Để chuyển tải khái niệm "không có giá trị", bạn cần một số sáng tạo.

Tất nhiên, như đã đề cập ở trên, một số người sử dụng chuỗi rỗng để biểu thị không có giá trị. Để làm việc này, các chuỗi rỗng không thể hợp lệ trong tập dữ liệu bạn đang xử lý. Đáng ngạc nhiên, rất nhiều dữ liệu thực tế rơi vào thể loại này.

Một cách khác để biểu thị sự vắng mặt của giá trị là chỉ cần ném một lỗi. Trong một số trường hợp, đây chính xác là những gì nên được thực hiện thay vì trả về một số giá trị null hoặc lỗi (một anti-pattern học được từ C và một thói quen khó loại bỏ).

Một cách khác là trả lại danh sách trống (danh sách tương đương với mảng của Tcl bằng các ngôn ngữ khác). Biểu diễn chuỗi của một danh sách rỗng là chuỗi rỗng. Nhưng may mắn thay, chuỗi đại diện của một danh sách chứa một chuỗi rỗng là hai dấu ngoặc kép: "\"\"". Sự khác biệt này cho phép một để phân biệt giữa một danh sách có chứa "không có gì" và một danh sách có chứa một chuỗi không có ký tự trong đó.

Cuối cùng một số người chỉ đơn giản là cho biết sự vắng mặt của các giá trị đơn giản bằng cách không khai báo biến (hoặc không khai báo nó, đó là một điều trong tcl). Điều này nghe có vẻ kỳ quặc bởi vì các biến có vẻ là một cấu trúc biên dịch thời gian (trong khi các giá trị là cấu trúc thời gian chạy) nhưng trong tất cả mọi thứ, tất cả mọi thứ đều là thời gian chạy. Vì vậy, có thể cho mã để sử dụng không tồn tại của biến như một tín hiệu. Cố gắng đọc một biến không khai báo dẫn đến một lỗi mà bạn có thể bắt được. Ngoài ra, Tcl cũng cho phép bạn sử dụng nội tâm để kiểm tra trạng thái của trình thông dịch. Vì vậy, bạn có thể sử dụng [info exist x] để kiểm tra xem biến có tên là x tồn tại hay không.

+2

Cố ý "không khai báo" biến là một tính năng của nhiều ngôn ngữ được nhập động. Perl có 'undef', Javascript có' delete', Bash có 'unset'. – sleske

+0

Rất thú vị. Cảm ơn bạn đã chia sẻ thông tin TCL – MegaTux

+0

Điều này bỏ lỡ vấn đề. Về mặt ngữ nghĩa, một chuỗi rỗng cũng không kém phần rỗng. Một ngôn ngữ được gõ đúng - theo nhiều ngôn ngữ - không nên làm cho nó có thể thậm chí gián tiếp tham khảo một giá trị không có mặt. Theo ngữ nghĩa thông thường, một chuỗi rỗng không phải là một giá trị "hiện diện". Tất nhiên, nếu mọi thứ là một chuỗi, nó sẽ tránh bạn khỏi các lỗi như cố gắng nối chuỗi '' '" foo "' '' với một chuỗi rỗng '' '" "' '', nhưng sau đó bạn thường cần kiểm tra tính trống rỗng của chuỗi ở một số nơi (ví dụ: xác thực, tham gia chuỗi bằng dấu phẩy, v.v.) – EdvardM

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