为什么有时需要外部板条箱?

Ama*_*ari 14 module rust

我想知道,为什么有时我们需要使用extern crateover use?我正在使用板条箱wee_alloc并导入我必须使用的模块extern crate

extern crate wee_alloc;

// Use `wee_alloc` as the global allocator.
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
Run Code Online (Sandbox Code Playgroud)

但是web_sys我可以只使用use.

Ibr*_*med 29

tldr:你不需要写下去的extern箱外部的依赖关系在2018年锈没有你提供的代码extern crate与作品就好edition = "2018"在你的集合Cargo.toml

不再 extern crate

您不再需要编写extern crate将 crate 导入到您的项目中。前:

// Rust 2015

extern crate futures;

mod foo {
    use futures::Future;
}

Run Code Online (Sandbox Code Playgroud)

后:

// Rust 2018

mod foo {
    use futures::Future;
}
Run Code Online (Sandbox Code Playgroud)

extern crate 的另一个用途是导入宏;不再需要了。在 Rust 2015 中,你会这样写:

// Rust 2015

#[macro_use]
extern crate log;

fn main() {
    error!("oops");
}
Run Code Online (Sandbox Code Playgroud)

现在,你写:

// Rust 2018

use log::error;

fn main() {
    error!("oops");
}
Run Code Online (Sandbox Code Playgroud)

重命名板条箱

如果您一直使用as这样重命名您的箱子:

extern crate futures as fut;
Run Code Online (Sandbox Code Playgroud)

然后在 Rust 2018 中,您只需执行以下操作:

use futures as fut;

use fut::Future;
Run Code Online (Sandbox Code Playgroud)

系统根箱

这个规则有一个例外,那就是“sysroot”包。这些是随 Rust 本身分发的板条箱。现在,您仍然需要使用extern crate这些 crate:

  • proc_macro
  • core
  • std

但是,extern crate std并且extern crate core已经是隐式的,因此您很少需要手动声明它们。

最后,在每晚,您将需要它用于以下板条箱:

  • alloc
  • test

这些是规则的唯一例外。因此,您提供的代码extern crate在 Rust 2018 中没有问题:

extern crate futures as fut;
Run Code Online (Sandbox Code Playgroud)

设置你的 Rust 版本

仅仅因为您安装了最新的 Rust版本并不意味着您正在使用最新版本进行编译。要告诉 Cargo 使用特定版本,请设置edition键/值对。例如:

use futures as fut;

use fut::Future;
Run Code Online (Sandbox Code Playgroud)

如果没有edition密钥,Cargo 将默认使用 Rust 2015。但在这种情况下,我们选择了 2018,因此我们的代码使用 Rust 2018 编译!感谢@KevinReid 指出这一点

这个答案来自Rust 版指南

  • 我认为缺少的区别是,_安装_最新_版本_ Rust 并不意味着所选_语言版本_将是最新的。 (2认同)