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