2014-07-19 31 views
17

Rust có loại đơn vị , (), loại có giá trị bằng 0. Giá trị của loại đơn vị này cũng được chỉ định sử dụng ().Mục đích của loại thiết bị trong Rust là gì?

Mục đích của loại đơn vị và giá trị của nó là gì? Đây có phải là cơ chế để tránh sử dụng null (hoặc nil) như các ngôn ngữ khác không?

+1

Nó giống như 'void' trong ngôn ngữ giống như C. Theo như tôi biết, mọi thứ đều là một biểu hiện trong rỉ sét, vì vậy '()' là giá trị được trả về bởi cái gì đó chỉ được thực hiện cho các hiệu ứng của nó. – Lee

+0

Bạn có thể tạo các kiểu không có kích thước bằng 0, giống như '()' bằng cách nói 'struct MyNewZeroSizeType;' Nó có thể hữu ích ("loại đánh dấu"!) – bluss

+1

Nó không giống như 'null' trong java vì nếu bạn nói rằng bạn trả về một 'int' bạn không thể trả về'() 'thay cho nó. – JustGage

Trả lời

25

() là giá trị của loại () và mục đích của nó là vô ích.

Mọi thứ trong Rust là một biểu thức và biểu thức trả về "không có gì" thực sự trả về (). Trình biên dịch sẽ đưa ra một lỗi nếu bạn có một hàm mà không có kiểu trả về nhưng trả lại một cái gì đó khác với bất kỳ cái nào khác là (). Ví dụ:

fn f() { 
    1i // error: mismatched types: expected `()` but found `int` 
} 

Có sử dụng thực tế cho (). Đôi khi, chúng tôi không quan tâm đến loại chung và () làm cho điều này rõ ràng.

Ví dụ: Result<(), String> có thể được sử dụng làm loại trả lại cho hàm hoàn tất thành công hoặc không thành công vì nhiều lý do.

+0

Giả sử ta cũng có thể định nghĩa các phương thức cho nó, nhưng sẽ không có trạng thái nào liên kết với những thứ đó ... Có đúng không? – errordeveloper

+1

@errordeveloper có, khá nhiều thứ bạn có thể làm với '()' có một triển khai tầm thường. – huon

7

Nếu bạn đến từ ngôn ngữ giống C (C, C++, Java, v.v.), bạn có thể nghĩ đơn vị giống như void. Đây là loại bạn trở lại khi bạn không muốn trả lại bất kỳ thứ gì.

Loại nhà lý thuyết sẽ chỉ ra rằng đơn vị không giống như void, bởi vì đơn vị có chính xác 1 giá trị trong khi void có 0 giá trị. Trong thực tế, lượng thông tin bạn có thể lưu trữ trong cả hai loại là giống nhau (0 bit) mặc dù ngôn ngữ sử dụng đơn vị có xu hướng đẹp hơn vì bạn có thể xử lý nó như bất kỳ giá trị nào khác.

Bạn có thể lưu trữ nó trong biến, cấu trúc, bộ sưu tập hoặc bất kỳ nơi nào khác mà bạn có thể lưu trữ giá trị. Bạn có thể chuyển như một đối số hoặc trả lại kết quả. Bạn có thể tạo một tham chiếu đến nó. Vv

Vì vậy, khi nào thì hữu ích? Chủ yếu là khi bạn không quan tâm bạn đang xử lý loại giá trị nào. Nó có nghĩa là bạn có thể viết mã đa hình/chung chung mà không cần phải lo lắng về việc liệu giá trị bạn đang xử lý có chứa bất kỳ thông tin nào không. Tức là, Không cần trường hợp đặc biệt cho dù bạn đang lưu trữ dữ liệu thực tế hay ().

Một ví dụ về địa điểm này được sử dụng là trong HashSet. A HashSet<T> thực sự được triển khai dưới dạng a thin wrapper around HashMap<T,()>. (Bản đồ từ loại chung T đến ())

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