gpt4 book ai didi

arrays - 初始化固定长度数组的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 11:39:58 25 4
gpt4 key购买 nike

我在初始化固定长度数组时遇到麻烦。 My attempts so far all result in the same "use of possibly uninitialized variable: foo_array " error:

#[derive(Debug)]
struct Foo { a: u32, b: u32 }

impl Default for Foo {
fn default() -> Foo { Foo{a:1, b:2} }
}

pub fn main() {
let mut foo_array: [Foo; 10];

// Do something here to in-place initialize foo_array?

for f in foo_array.iter() {
println!("{:?}", f);
}
}

error[E0381]: use of possibly uninitialized variable: `foo_array`
--> src/main.rs:13:14
|
13 | for f in foo_array.iter() {
| ^^^^^^^^^ use of possibly uninitialized `foo_array`

我实现了 Default特性,但是默认情况下,Rust似乎没有像C++构造函数那样调用它。

初始化固定长度数组的正确方法是什么?我想进行高效的就地初始化,而不是某种复制。

相关: Why is the Copy trait needed for default (struct valued) array initialization?

相关: Is there a way to not have to initialize arrays twice?

最佳答案

安全但somewhat inefficient solution:

#[derive(Copy, Clone, Debug)]
struct Foo {
a: u32,
b: u32,
}

fn main() {
let mut foo_array = [Foo { a: 10, b: 10 }; 10];
}

由于您专门要求 a solution without copies:

use std::mem::MaybeUninit;

#[derive(Debug)]
struct Foo {
a: u32,
b: u32,
}

// We're just implementing Drop to prove there are no unnecessary copies.
impl Drop for Foo {
fn drop(&mut self) {
println!("Destructor running for a Foo");
}
}

pub fn main() {
let array = {
// Create an array of uninitialized values.
let mut array: [MaybeUninit<Foo>; 10] = unsafe { MaybeUninit::uninit().assume_init() };

for (i, element) in array.iter_mut().enumerate() {
let foo = Foo { a: i as u32, b: 0 };
*element = MaybeUninit::new(foo);
}

unsafe { std::mem::transmute::<_, [Foo; 10]>(array) }
};

for element in array.iter() {
println!("{:?}", element);
}
}

这是 the documentation of MaybeUninit 推荐的。

关于arrays - 初始化固定长度数组的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59501157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com