Я пытаюсь реализовать игрушку hashmap в Rust с нуля и получить зацепило при фактической инициализации ведер, которые мне нужны. Я получил эту работу с массивом ведер с другими примитивами, такими как u8 (показано ниже в комментариях ниже).Выделение/копирование вектора строк/векторов в хэш-карте ржавчины?
Я не могу понять, как сказать компилятору выделить меня изменяемый вектор, который содержит другие векторы - в данном случае - ~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 или просто copypasting в станде Hashmap LIB, я не уверен, как поступить.
Я понимаю, что было бы лучше пройти <T>
вокруг класса, чтобы он был гибким, но предпочитает сначала вычерчивать этот бит.
EDIT: исправлена ошибка get(), чтобы избежать захвата всей структуры.