让编译器相信数组的每个索引都将被初始化
Convincing the compiler that every index of an array will be initialized
我正在尝试为包含 20 个元素的缓冲区实现 Rand
特性,这些元素本身实现了 Rand
特性。我遍历缓冲区并使用随机值初始化每个元素。但是,我无法让编译器相信 buff
最终会完全初始化。
我应该怎么做才能让它接受这个?
extern crate rand;
use rand::{Rand, Rng};
struct Buf20<T>([T; 20]);
impl<T: Rand> Rand for Buf20<T> {
fn rand<R: Rng>(rng: &mut R) -> Self {
let mut buff : [T; 20];
for element in &mut buff {
*element = rng.gen();
}
Buf20(buff)
}
}
你无法让编译器相信这一点,因为它不一定是真的。
此处有两种未知类型,T
和 R
,它们的交互可能会破坏这里的内容。下面是 Rand
和 Rng
的几个可能的实现,它们会使它爆炸:
struct T(Box<u32>);
impl Rand for T {
fn rand<R: Rng>(rng: &mut R) -> Self {
T(Box::new(rng.next_u32()))
}
}
struct R(u32);
impl Rng for R {
fn next_u32(&mut self) -> u32 {
let next = self.0;
self.0 += 1;
if self.0 > 10 {
panic!();
}
next
}
}
基本上,如果 R
有可能触发恐慌并且 T
有一个析构函数,那么您将进入未定义的行为,因为数组的元素可能并非全部不是在那个阶段初始化。 Box<T>
是此类未定义行为的一个特别好的例子,因为您将尝试释放未定义的内存地址。
这就是为什么这样使用数组需要 (a) 有一个长度成员来显示数组中有多少项有数据,这样你就可以跳过其余的析构函数(这需要更多不安全的代码,当然,简单地禁用析构函数不是目前本地支持的东西),或者(b)用 Option
包装每个项目,将未初始化的值设置为 None
以便非法值的析构函数不会是 运行.
或者 (c) 您可以使用向量。
固定大小的数组目前在 Rust 中排名第二class。
我正在尝试为包含 20 个元素的缓冲区实现 Rand
特性,这些元素本身实现了 Rand
特性。我遍历缓冲区并使用随机值初始化每个元素。但是,我无法让编译器相信 buff
最终会完全初始化。
我应该怎么做才能让它接受这个?
extern crate rand;
use rand::{Rand, Rng};
struct Buf20<T>([T; 20]);
impl<T: Rand> Rand for Buf20<T> {
fn rand<R: Rng>(rng: &mut R) -> Self {
let mut buff : [T; 20];
for element in &mut buff {
*element = rng.gen();
}
Buf20(buff)
}
}
你无法让编译器相信这一点,因为它不一定是真的。
此处有两种未知类型,T
和 R
,它们的交互可能会破坏这里的内容。下面是 Rand
和 Rng
的几个可能的实现,它们会使它爆炸:
struct T(Box<u32>);
impl Rand for T {
fn rand<R: Rng>(rng: &mut R) -> Self {
T(Box::new(rng.next_u32()))
}
}
struct R(u32);
impl Rng for R {
fn next_u32(&mut self) -> u32 {
let next = self.0;
self.0 += 1;
if self.0 > 10 {
panic!();
}
next
}
}
基本上,如果 R
有可能触发恐慌并且 T
有一个析构函数,那么您将进入未定义的行为,因为数组的元素可能并非全部不是在那个阶段初始化。 Box<T>
是此类未定义行为的一个特别好的例子,因为您将尝试释放未定义的内存地址。
这就是为什么这样使用数组需要 (a) 有一个长度成员来显示数组中有多少项有数据,这样你就可以跳过其余的析构函数(这需要更多不安全的代码,当然,简单地禁用析构函数不是目前本地支持的东西),或者(b)用 Option
包装每个项目,将未初始化的值设置为 None
以便非法值的析构函数不会是 运行.
或者 (c) 您可以使用向量。
固定大小的数组目前在 Rust 中排名第二class。