Почему rand :: Rng может работать в среде no-std, даже если я не установил default-features = false? - PullRequest
2 голосов
/ 25 марта 2019

Разве мне не нужно отключить флаг std функции rand , прежде чем я смогу использовать его в среде 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"

Я не использую #![no_std] в моем main.rs , хотя.

1 Ответ

3 голосов
/ 25 марта 2019

Да, вам нужно отключить функцию rand std, чтобы использовать ее в среде, где std недоступен.Однако, если std доступно , отключение функции std все равно будет работать.

#![no_std] изменяет прелюдию вашей корзины с прелюдии std на core прелюдия.Прелюдия std выглядит следующим образом:

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

Прелюдия core такая же, но с core вместо std.Это означает, что, если вы не напишите extern crate std;, ваш ящик не будет зависеть от std напрямую.

Однако #![no_std] не влияет на ваши зависимости. Справочник по ржавчине имеет соответствующее предупреждение:

⚠️ Предупреждение. Использование no_std не препятствует подключению стандартной библиотеки. По-прежнему допустимо вводить extern crate std; в ящик и зависимости могут также связать его.

Поэтому, если для вашей цели доступно std, а для одной из ваших зависимостей требуется std, она сможет использовать ее,С другой стороны, если std недоступно для цели, то ящики, которые пытаются использовать ее (неявно или явно), не будут компилироваться.

...