为什么即使我没有设置 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 将无法编译。
我不需要 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 putextern crate std;
into the crate and dependencies can also link it in.
因此,如果 std
可用于您的目标并且您的依赖项之一需要 std
,那么它将能够使用它。另一方面,如果 std
不适用于目标,则尝试使用它(隐式或显式)的 crate 将无法编译。