Estou tentando implementar o HashMap. A definição básica é:
pub struct CLHashMap<K, V> {
buckets: Vec<Vec<(K, V)>>,
count: usize
}
Para a função de redimensionamento, eu tenho isto:
let newSize = ....
let newBuckets = vec![Vec::new(); newSize]; // error here
for mut items in self.buckets.drain(..) {
for (key, value) in items.drain(..) {
let mut hasher = DefaultHasher::new();
key.hash(&mut hasher);
let index = (hasher.finish() % newBuckets.len() as u64) as usize;
newBuckets[index].push((key, value));
}
}
mem::replace(&mut self.buckets, newBuckets);
Isso dá erro na linha anotada no código.
error[E0277]: the trait bound `K: Clone` is not satisfied in `(K, V)`
Erro, eu entendo, mas não sei por que a ferrugem precisa que a característica clone seja implementada por V.
A cópia/clonagem está envolvida aqui?
Você está pensando nisso em termos de "
Vec<T>
está vazio, então por que não pode ser clonadon
?".Bem, como você
vec.clone()
sabe quevec
está vazio? Isso não acontece. Em resumo,vec![item; n]
simplesmente cria instânciasVec<T>
contendon
(clonadas) deitem
.Como
item
éVec<(K, V)>
, então(K, V)
deve implementarClone
, caso contrárioVec<(K, V)>
não implementaClone
.Simplesmente não existe , o que realmente
vec.clone_if_empty()
não faz sentido.Em vez de criar um
Vec<Vec<T>>
contendo sn
vaziosVec<T>
, você pode usar, por exemploiter::repeat_with()
,take(n)
, ecollect()
:ou