为什么我需要声明"extern crate core"才能使用libcore?

Pet*_*Guo 3 rust rust-cargo

随着核心库拉斯特1.6稳定,以下成为可能,并且我也不需要更换libcorelibstd任何更多:

//extern crate core; //won't work without this line
extern crate num;

use core::ops::Add;
use num::bigint::{BigInt};

fn main() {
    let mut big = "8705702225074732811211966512111".parse::<BigInt>().unwrap();
    let one = "1".parse::<BigInt>().unwrap();
    big = big.add(&one);
    println!("{:?}", big);
}
Run Code Online (Sandbox Code Playgroud)

但是有一件事让我感到困惑 - 为什么我需要宣布"extern crate core;"?据我所知,libstd意在构建之上libcore.libcore意味着独立于操作系统,而实现libstd可以是特定于操作系统的.我从来没有必要指定"extern crate std".令我困惑的是,libcore在上述情况下,我不需要在Cargo.toml中添加依赖项,尽管它是一个外部箱子.

libcore唯一的此类情况?当语言的实现变得稳定时,这是暂时的吗?

Vla*_*eev 10

事实上,一切都以非常合理的方式运作.

首先,libstd箱子确实很特别.Rust编译器知道它并且它会extern crate std;隐式注入,除非#![no_std]crate root上存在属性.此外,它还会在您的箱子的每个模块中导入标准前奏(再次,除非#![no_std]存在).

现在您可以看到为什么必须extern crate core;在不需要指定的同时指定extern crate std;.你也不需要指定coreCargo.toml,因为libcore,以及其他几个图书馆(libcollections,liballoc,liblibc,等等;你可以找到一个上最新列表鲁斯特源目录)存在于锈编译器分布.事实上,希望允许这些库通过Cargo可用(以RFC的形式表示),但是到目前为止这些库仅提供编译器分发.

最后,请记住,Rust crates是独立的.Rust ABI以这样的方式设计,因此您可以在最终的可执行文件中内置相同的crate的不同版本.虽然一个箱子直接依赖同一个箱子的多个版本是无效的,但它的依赖关系可能传递上依赖于另一个箱子的不同版本.这就是为什么你总是要明确指定crate的依赖关系的原因之一:如果你没有指定你的crate依赖libcore,即使libstd依赖libcore,libcore你的crate也不会自动提取它libstd.