rust 为'Option〈Box>'实现'Copy'特性< Struct>[复制]

5gfr0r5j  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(130)
    • 此问题在此处已有答案**:

Initialize a large, fixed-size array with non-Copy types(8个答案)
21小时前关门了。
我试图在Rust中实现一个简单的带有外部链接的哈希表,但是在表声明方面遇到了麻烦。

static mut _HASH_TABLE: [Option<Box<MemoryMap>>; (std::u16::MAX -1) as usize] = [None; (std::u16::MAX -1) as usize];

其中MemoryMap是动态链接列表

pub struct MemoryMap {
    entry: SimpleEntry,
    next: Option<Box<MemoryMap>>,
}

impl MemoryMap {
    pub fn new(init_key: String, init_value: Box<dyn Storable>) -> MemoryMap {
        MemoryMap {
            entry: SimpleEntry::new(init_key, init_value),
            next: None,
        }
    }
//...
}

pub struct SimpleEntry {
    key: String,
    value: Box<dyn Storable>,
}

impl SimpleEntry {
    pub fn new(key: String, value: Box<dyn Storable>) -> SimpleEntry {
        SimpleEntry { key, value }
    }
//...
}

也就是说,我得到了这个错误

5 | static mut _HASH_TABLE: [Option<Box<MemoryMap>>; (std::u16::MAX -1) as usize] = [None; (std::u16::MAX -1) as usize];
  |                                                                                                                                                           ^^^^ the trait `Copy` is not implemented for `Box<MemoryMap>`
  |
  = note: required for `Option<Box<MemoryMap>>` to implement `Copy`
  = note: the `Copy` trait is required because this value will be copied for each element of the array

我不明白为什么要复制数组的元素,因为我希望数组获得Box<MemoryMap>的所有权

jdgnovmf

jdgnovmf1#

我不明白为什么必须复制数组的元素,因为我希望数组获得Box<MemoryMap>的所有权
当你写作的时候

[None; (std::u16::MAX -1) as usize]

系统需要获取您给它的一个值,并将其复制std::u16::MAX - 1次以填充数组。To do that, it uses Copy
重复表达式[x; N],它生成一个包含xN个副本的数组。x的类型必须为Copy
这在这里不起作用,因为即使None值很小,就Rust而言,Option<T>实现Copy的条件是T实现Copy,而Box<_>不实现Copy,因此需要实现另一个初始化方法,如@cafce25链接的方法,或者使用once_cell/lazy_static以便具有在运行时(懒惰)初始化的全局变量,并且可能类似于Vec
尽管坦率地说,我不明白你为什么要创建一个全局可变的东西,更不用说初始化一个固定的65k条目(64位指针)了。

相关问题