为什么即使我没有设置 default-features = false,rand::Rng 也能在 no-std 环境中工作?

Why is rand::Rng able to work in a no-std environment even when I have not set default-features = false?

我不需要 disable rand's std feature flag 才能在 no_std 环境中使用它吗?

lib.rs

#![no_std]

use rand::Rng;

pub fn random_small() -> u8{
    rand::thread_rng().gen::<u8>()
}

Cargo.toml

[dependencies]

rand = "0.6.5"

虽然我没有在 main.rs 中使用 #![no_std]

是的,您需要禁用 rand 的 std 功能才能在 std 不可用的环境中使用它。但是,如果 std 可用,则不禁用 std 功能仍然有效。

#![no_std] 将您的箱子的前奏从 std 前奏更改为 core 前奏。 std 前奏看起来像:

extern crate std;
use std::prelude::v1::*;

core 前奏是相同的,但使用 core 而不是 std。这意味着,除非你写 extern crate std;,否则你的 crate 并不直接依赖于 std

但是,#![no_std] 对您的依赖项没有影响。 The Rust Reference 有相关警告:

⚠️ Warning: Using no_std does not prevent the standard library from being linked in. It is still valid to put extern crate std; into the crate and dependencies can also link it in.

因此,如果 std 可用于您的目标并且您的依赖项之一需要 std,那么它将能够使用它。另一方面,如果 std 不适用于目标,则尝试使用它(隐式或显式)的 crate 将无法编译。