2016-01-24 154 views
2

随着核心库拉斯特1.6稳定,以下成为可能,我不需要用libstd更多的替换libcore任何:为什么我需要声明“extern crate core”来使用libcore?

//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); 
} 

但有一件事我感到困惑 - 为什么我需要声明“外部箱子核心”?据我所知,libstd是建立在libcore之上的。 libcore旨在独立于操作系统,而libstd的实现可以是操作系统特定的。我从来没有必要指定“extern crate std”。令我感到困惑的是,在上述情况下,我不需要在Cargo.toml中添加libcore作为依赖关系,尽管它是一个外部条目。

libcore唯一的此类情况?这是一个暂时的事情,而语言的实施得到了稳定?

回答

7

事实上,所有的事情都是以一种非常合理的方式进行的。

首先,libstd箱子确实是特殊的。 Rust编译器知道它,并且它隐式地注入extern crate std;,除非#![no_std]属性出现在板条根上。此外,它还会在您的箱子的每个模块中输入标准前奏(同样,除非有#![no_std]存在)。

现在你可以看到为什么你必须指定extern crate core;,而同时你不需要指定extern crate std;。您也不需要在Cargo.toml中指定core,因为libcore以及其他几个库(libcollections,liballoc,liblibc等;您可以找到最新的列表in Rust source directory)存在于Rust编译器分发中。实际上也希望允许这些库也可以通过Cargo获得(以RFC的形式表示),但截至目前,这些库仅提供了编译器发行版。

最后,请记住,锈箱子是独立的。 Rust ABI以这种方式设计,因此您可以在最终可执行文件中包含不同版本的同一个箱子。虽然一个箱子直接依赖同一箱子的多个版本是无效的,但它的依赖关系可能依赖于另一个箱子的不同版本。这其中的原因,你总是必须明确地指定箱子的依赖关系之一:如果你不指定您的箱子取决于libcore,即使libstd不依赖于libcorelibcore不会被你的箱子自动拉若它使用libstd

相关问题