我正在尝试用Rust从头实现一个玩具哈希映射,并且在实际初始化所需的存储桶时遇到了问题。我已经将这个过程运用在了其他基元类型如u8的桶数组中(如下面片段的注释所示)。
但我无法弄清如何告诉编译器为我分配一个持有其他向量的可变向量——在这种情况下是 ~str
。该代码可以编译,但在运行时会出现一个索引越界
错误。
static DEFAULT_NUMBER_OF_BUCKETS: uint = 64;
static DEFAULT_VALUE_LENGTH: uint = 32; //unused
struct NaiveHashMap {
hashmap_size: uint, //unused.
string_capacity: uint, //unused.
//contents: ~[ u8 ]
contents: ~[ ~str ]
}
impl NaiveHashMap {
fn new(hash_size: uint, string_size: uint) -> NaiveHashMap {
NaiveHashMap {
hashmap_size: hash_size, //unused
string_capacity: string_size, //unused
//contents: ~[ 0, ..DEFAULT_NUMBER_OF_BUCKETS ]
contents: std::vec::with_capacity::<~str>(DEFAULT_NUMBER_OF_BUCKETS)
}
}
fn get_hash(&self, key: &str) -> u32 {
let hash: u32 = jenkins_hash(key);
hash % self.hashmap_size.to_u32().unwrap()
}
//fn add(&mut self, key: &str, value: u8) {
fn add(&mut self, key: &str, value: ~str) {
let bucket = self.get_hash(key);
self.contents[bucket] = value;
}
//fn get(self, key: &str) -> u8 {
fn get(&self, key: &str) -> ~str {
let bucket = self.get_hash(key);
self.contents[bucket].clone()
}
}
除了调用unsafe的from_buf分配或copy标准的Hashmap库外,我不确定该如何继续。
我意识到最好的实践是在类中传递以使其具有灵活性,但首选先解决这个问题。
编辑:修改了get()以避免捕获整个结构体。