I would like to know, why sometimes we need to use extern crate
over use
? I'm using the crate wee_alloc
and to import its modules I have to use extern crate
:
extern crate wee_alloc;
// Use `wee_alloc` as the global allocator.
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
But with web_sys
I can just use use
.
extern crate is no longer needed in 99% of circumstances. The crate keyword refers to the current crate. Paths may start with a crate name, even within submodules. Paths starting with :: must reference an external crate.
An extern crate declaration specifies a dependency on an external crate. The external crate is then bound into the declaring scope as the identifier provided in the extern crate declaration.
The extern keyword is used in two places in Rust. One is in conjunction with the crate keyword to make your Rust code aware of other Rust crates in your project, i.e., extern crate lazy_static; . The other use is in foreign function interfaces (FFI). extern is used in two different contexts within FFI.
Keyword crate A Rust binary or library. The primary use of the crate keyword is as a part of extern crate declarations, which are used to specify a dependency on a crate external to the one it's declared in. Crates are the fundamental compilation unit of Rust code, and can be seen as libraries or projects.
tldr: You do not need to write extern crate anymore for external dependencies in Rust 2018. The code you provided without extern crate
works just fine with edition = "2018"
set in your Cargo.toml
extern crate
You no longer need to write extern crate
to import a crate into your project. Before:
// Rust 2015
extern crate futures;
mod foo {
use futures::Future;
}
After:
// Rust 2018
mod foo {
use futures::Future;
}
One other use for extern crate was to import macros; that's no longer needed. In Rust 2015, you would have written:
// Rust 2015
#[macro_use]
extern crate log;
fn main() {
error!("oops");
}
Now, you write:
// Rust 2018
use log::error;
fn main() {
error!("oops");
}
If you've been using as
to rename your crate like this:
extern crate futures as fut;
Then in Rust 2018, you simply do this:
use futures as fut;
use fut::Future;
There's one exception to this rule, and that's the "sysroot" crates. These are the crates distributed with Rust itself. For now, you still need to use extern crate
for these crates:
proc_macro
core
std
However, extern crate std
and extern crate core
are already implicit, so it is very rare that you will need to declare them manually.
Finally, on nightly, you'll need it for crates like:
alloc
test
Those are the only exceptions to the rule. Therefore, the code you provided without extern crate
works just fine in Rust 2018:
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
Just because you have the latest Rust version installed does not mean that you are compiling with the latest edition. To tell Cargo to use a specific edition, set the edition
key/value pair. For example:
[package]
name = "foo"
edition = "2018"
If there's no edition
key, Cargo will default to Rust 2015. But in this case, we've chosen 2018, and so our code is compiling with Rust 2018! Thanks to @KevinReid for pointing this out
This answer was derived from The Rust Edition Guide
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With