我正在尝试初始化一些可为空,不可复制的固定大小的数组,例如
Option<Box<Thing>>
对于某种
Thing
.我想将其中两个打包成一个结构,而无需任何额外的间接调用.我想写这样的东西:
let array: [Option<Box<Thing>>; SIZE] = [None; SIZE];
但这不起作用,因为
[e; n]
语法要求
e
实现
Copy
.当然,我可以将其扩展为
SIZE
None
s,但是当
SIZE
时可能很难理解
大.我不相信如果没有不自然的
SIZE
编码,就无法使用宏完成此操作
.有什么好方法吗?
是的,使用
unsafe
很容易
; 有没有办法不用
unsafe
?
最新回答
- 2021-1-101 #
- 2021-1-102 #
我正在复制chris-morgan的答案,并对其进行调整以更好地匹配问题,以遵循dbaupp downthread的建议并匹配最新的 语法更改:
use std::mem; use std::ptr; #[derive(Debug)] struct Thing { number: usize, } macro_rules! make_array { ($n:expr, $constructor:expr) => {{ let mut items: [_; $n] = mem::uninitialized(); for (i, place) in items.iter_mut().enumerate() { ptr::write(place, $constructor(i)); } items }} } const SIZE: usize = 50; fn main() { let items = unsafe { make_array!(SIZE, |i| Box::new(Some(Thing { number: i }))) }; println!("{:?}", &items[..]); }
请注意需要使用
unsafe
此处:问题在于,如果构造函数panic!
s,这将导致不确定的行为。 - 2021-1-103 #
这是"保持简单"的答案:只需键入所有值:
struct Thing; const SIZE: usize = 5; fn main() { let array: [Option<Box<Thing>>; SIZE] = [None, None, None, None, None]; }
您还可以使用构建脚本为您生成此代码.有关此示例,请参见:
How to create a static string at compile time
您可以使用
Default
特质以默认值初始化数组:请参阅此操场以获取工作示例。