2016-01-24 104 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

相關問題