首页 > 解决方案 > 为什么即使我没有设置 default-features = false,rand::Rng 也能在无标准环境中工作?

问题描述

我不应该在环境中使用它之前禁用 rand 的std功能标志吗?no_std

库文件

#![no_std]

use rand::Rng;

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

货运.toml

[dependencies]

rand = "0.6.5"

我没有#![no_std]在我的main.rs中使用。

标签: rustbare-metal

解决方案


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

#![no_std]您的箱子的前奏从std前奏变为core前奏。std前奏长这样:

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

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

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

⚠️ 警告:使用no_std并不会阻止标准库的链接。放入extern crate std;crate 中仍然有效,依赖项也可以链接。

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


推荐阅读