gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:56:22 24 4
gpt4 key购买 nike

随着 Rust 1.6 中稳定的核心库,以下成为可能,我不再需要将 libcore 替换为 libstd:

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

但是有一件事让我很困惑——为什么我需要声明“extern crate core;”?据我所知,libstd 旨在构建在 libcore 之上。 libcore 是独立于操作系统的,而 libstd 的实现可以是特定于操作系统的。我从来不需要指定“extern crate std”。同样让我感到困惑的是,在上述情况下,我不需要将 libcore 添加为 Cargo.toml 中的依赖项,尽管它是一个 extern crate。

libcore 是唯一的这种情况吗?这是语言实现趋于稳定时的暂时现象吗?

最佳答案

事实上,一切都以一种非常合乎逻辑的方式运作。

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

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

最后,请记住 Rust crates 是独立的。 Rust ABI 以这种方式设计,因此您可以将同一个 crate 的不同版本构建到最终的可执行文件中。虽然一个 crate 直接依赖同一个 crate 的多个版本是无效的,但它的依赖项可以传递地依赖另一个 crate 的不同版本。这就是为什么你总是必须明确指定你的 crate 依赖项的原因之一:如果你没有指定你的 crate 依赖于 libcore,即使 libstd 确实依赖在 libcore 上,如果它使用 libstdlibcore 将不会被你的 crate 自动拉取。

关于rust - 为什么我需要声明 "extern crate core"才能使用 libcore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34972258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com