首页>Program>source

我正在尝试初始化一些可为空,不可复制的固定大小的数组,例如 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-10
    1 #

    您可以使用 Default 特质以默认值初始化数组:

    let array: [Option<Box<Thing>>; SIZE] = Default::default();
    

    请参阅此操场以获取工作示例。

  • 2021-1-10
    2 #

    我正在复制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-10
    3 #

    这是"保持简单"的答案:只需键入所有值:

    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

  • c++11:未指定时,C ++运算符的操作数的值类别是什么?
  • asp classic:使用ASP VBScript的XML / SelectNodes出现问题