【发布时间】:2014-02-10 20:55:59
【问题描述】:
我正在尝试从头开始在 Rust 中实现一个玩具哈希图,并在实际初始化我需要的存储桶时遇到困难。我已经使用一组带有其他原语(如 u8)的存储桶(如下面的 sn-p 中的 cmets 所示)来实现这一点。
我不知道如何告诉编译器为我分配一个包含其他向量的可变向量——在本例中为~str。此代码可以编译,但在运行时失败并出现 index out of bounds 错误。
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()
}
}
没有调用不安全的 from_buf 分配或只是复制粘贴 std Hashmap 库,我不确定如何继续。
我意识到最好在课堂上传递一个<T>,这样会更灵活,但更愿意先弄清楚这一点。
编辑:修改 get() 以避免捕获整个结构。
【问题讨论】: