String 在Rust hashmap中分配/实例化字符串/向量的向量?

String 在Rust hashmap中分配/实例化字符串/向量的向量?,string,vector,rust,String,Vector,Rust,我试图从头开始在Rust中实现一个玩具hashmap,但在初始化我需要的存储桶时遇到了困难。我已经使用了一系列桶和其他原语,如u8(如下面代码段中的注释所示) 我搞不懂的是如何告诉编译器为我分配一个包含其他向量的可变向量——在本例中是,~str。此代码可编译,但在运行时失败,出现索引超出范围的错误 静态默认存储桶数:uint=64; 静态默认值长度:uint=32//未使用 结构哈希映射{ hashmap\u大小:uint,//未使用。 字符串\u容量:uint,//未使用。 //目录:~[u8

我试图从头开始在Rust中实现一个玩具hashmap,但在初始化我需要的存储桶时遇到了困难。我已经使用了一系列桶和其他原语,如u8(如下面代码段中的注释所示)

我搞不懂的是如何告诉编译器为我分配一个包含其他向量的可变向量——在本例中是,
~str
。此代码可编译,但在运行时失败,出现
索引超出范围的错误

静态默认存储桶数:uint=64;
静态默认值长度:uint=32//未使用
结构哈希映射{
hashmap\u大小:uint,//未使用。
字符串\u容量:uint,//未使用。
//目录:~[u8]
目录:~[~str]
}
impl-NaiveHashMap{
fn新(哈希大小:uint,字符串大小:uint)->NaiveHashMap{
NaiveHashMap{
hashmap\u size:hash\u size,//未使用
字符串容量:字符串大小,//未使用
//内容:~[0,…默认\u桶数\u]
内容:std::vec::with_capacity::(默认_bucket的数量)
}
}
fn get_散列(&self,key:&str)->u32{
let hash:u32=jenkins\u hash(key);
散列%self.hashmap\u size.to\u u32().unwrap()
}
//fn添加(&mut self,键:&str,值:u8){
fn添加(&mut self,键:&str,值:~str){
让bucket=self.get\u散列(key);
self.contents[bucket]=值;
}
//fn get(self,key:&str)->u8{
fn获取(&self,键:&str)->~str{
让bucket=self.get\u散列(key);
self.contents[bucket].clone()
}
}
除了调用不安全的from_buf分配或只是复制std Hashmap库之外,我不确定如何继续

我意识到最好的做法是在类中传递
,这样会更灵活,但我更愿意先弄清楚这一点


编辑:修改get()以避免捕获整个结构。

据我所知,您希望构造一个给定长度的向量,以便通过索引将内容写入其中

除非为向量的每个元素指定默认值,否则无法在Rust中安全地执行此操作。它与
~[u8]
一起工作,因为您指定了默认值(零),并且
u8
可隐式复制:

[0, ..DEFAULT_NUMBER_OF_BUCKETS]
但是您希望
~str
的默认值是什么?它是一个指针,指针在Rust中不能等于null,这是指针最自然的默认值。我认为
~str
的第二个最自然的值是
~”
,即空字符串。您可以使用它创建
N
字符串的向量:

vec::from_elem(N, ~"")
这将创建一个空的装箱字符串向量,但也意味着N个分配,这不是不需要考虑的事情

但是,您不能使用任意类型的
t
,因为在一般情况下,任意类型的
t
没有任何默认值。此外,任意
t
也可能无法
克隆,这是
from_elem()所要求的
。但是您可以从
T
创建另一个类型,该类型具有默认值。为此,您可以使用
选项

contents: ~[Option<T>]
顺便说一句,它因“索引超出边界”错误而失败的原因是,您正在使用
with_capacity()
函数。此函数创建长度为零但具有指定容量的向量。您可以使用
push()
方法将元素附加到向量的末尾,在达到其容量之前不会重新分配,但不能访问添加元素的“外部”元素

contents: vec::from_fn(N, |_| None)