Sự khác biệt giữa sử dụng và extern là gì?


81

Tôi mới làm quen với Rust. Tôi nghĩ rằng điều đó useđược sử dụng để nhập số nhận dạng vào phạm vi hiện tại và externđược sử dụng để khai báo một mô-đun bên ngoài. Nhưng sự hiểu biết này (có thể sai) không có ý nghĩa gì đối với tôi. Ai đó có thể giải thích tại sao Rust có hai khái niệm này và những trường hợp phù hợp để sử dụng chúng là gì?


5
Bạn đang đề cập đến tuyên bố extern crate foo;? Thùng và mô-đun là các khái niệm riêng biệt trong Rust, bạn có thể muốn xem "Thuật ngữ cơ bản: Thùng và Mô-đun" giải thích sự khác biệt giữa hai loại này (cá nhân tôi thấy các ví dụ dưới đây quá dài dòng).
Qantas 94 Heavy

Câu trả lời:


87

extern crate foochỉ ra rằng bạn muốn liên kết với thư viện bên ngoài và đưa tên thùng cấp cao nhất vào phạm vi (tương đương với use foo). Kể từ Rust 2018, trong hầu hết các trường hợp, bạn sẽ không cần sử dụng extern cratenữa vì Cargo đã thông báo cho trình biên dịch về những thùng nào hiện có. (Có một hoặc hai trường hợp ngoại lệ )

use bar là cách viết tắt để tham chiếu các ký hiệu đủ tiêu chuẩn.

Về mặt lý thuyết, ngôn ngữ này không cần use - bạn luôn có thể đáp ứng đầy đủ các tên gọi, nhưng việc gõ std::collections::HashMap.new(...)sẽ rất tẻ nhạt! Thay vào đó, bạn chỉ có thể nhập use std::collections::HashMapmột lần và sau đó HashMapsẽ tham chiếu đến điều đó.


3
Nếu không có use, chúng tôi thậm chí không thể có stdmặt tiền của nó. Hoặc chúng ta sẽ có một thùng thư viện tiêu chuẩn nguyên khối duy nhất, hoặc mọi người sẽ đối phó với thực tế Stringlà thực tế collections::string::String.

46

Câu trả lời được chấp nhận là chính xác tại thời điểm viết bài. Tuy nhiên, nó không còn đúng nữa. extern cratehầu như không bao giờ cần thiết kể từ Rust 2018.

Giờ đây, bạn chỉ cần thêm các phụ thuộc bên ngoài vào Cargo.toml của mình.

use hoạt động giống như trước đây.

Đọc thêm trong tài liệu chính thức .

Chỉnh sửa: Câu trả lời được chấp nhận hiện đã được chỉnh sửa để phản ánh chính xác những thay đổi trong Rust 2018.


Ngay cả khi nó không cần thiết, không có lợi ích trong việc tách thùng bên ngoài khỏi thùng tiêu chuẩn? Thích extern crate failure;nhưnguse std::error::Error
Paul Razvan Berg

2
@PaulRazvanBerg Ý của bạn là chỉ cần làm rõ cái nào là hàng nhập từ thư viện chuẩn và cái nào là hàng nhập khẩu bên ngoài? Ít nhất thì không đối với tôi, và tôi cũng không nghĩ điều đó được khuyến khích. Nhưng tôi nghĩ bạn nên cấu trúc mã của mình theo cách bạn cảm thấy hợp lý nhất với mình.
dropbear
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.