我試圖從頭開始在Rust中實現一個玩具hashmap,並在實際初始化我需要的桶時遇到阻礙。我已經使用了像u8這樣的其他基元的桶陣列(在下面的代碼片段中給出了註釋)。在Rust hashmap中分配/實例化字符串/向量的向量?
我無法弄清楚的是如何告訴編譯器爲我分配一個可變的向量,其中包含其他向量 - 在這種情況下,~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>
是更好的做法,所以它會很靈活,但是首先要想清楚這點。
編輯:修改get()以避免捕獲整個結構。