这是我的例子:
use std::collections::HashMap;
fn main() {
let mut my_map = HashMap::new();
let mut my_vec = vec![5,6,7];
my_map.insert(my_vec, 4);
// This part is fine, so I can create HashMap
// with mutable Vector as key.
my_vec.push(8);
}
Run Code Online (Sandbox Code Playgroud)
但是,我实际上无法修改矢量!my_vec.push(8);导致以下错误:
post_test_19.rs:14:5: 14:11 error: use of moved value: `my_vec` [E0382]
post_test_19.rs:14 my_vec.push(8);
^~~~~~
post_test_19.rs:7:19: 7:25 note: `my_vec` moved here because it has type `collections::vec::Vec<i32>`, which is non-copyable
post_test_19.rs:7 my_map.insert(my_vec, 4);
^~~~~~
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)
现在HashMap拥有了Vec,所以我无法修改它.
据我所知,即使它在技术上是可变的,你也不能修改Vec它是否被用作键HashMap.我的理解是否正确?我缺少一个技巧或角落案例吗?
不,你不能修改它,即使你可以,你绝对不应该做这样的事情.
在您的示例中,您无法修改向量的原因是因为您不再拥有它.您已将其所有权转让给地图.这就是"使用移动价值"的意思.
假设你有一些修改地图键的方法(我不打算提供任何例子来帮助阻止人们这样做).主要的问题是你要打破一个不变的HashMap:
以这样一种方式修改密钥是一个逻辑错误:密钥的哈希值由哈希特征确定,或由等式特征确定的等式,在它在地图中时发生变化.
一旦了解了hashmaps的工作原理,这一点很简单.添加密钥时,会运行一个算法,将密钥转换为整数(密钥经过哈希处理).然后,此整数用于查找数组中的空间以存储该值.
如果更改了密钥,则该值将存储在数组中的错误位置.举一个简单的例子,假设向量的散列算法只是向量中的项目数.如果您添加vec![1]为键,它将存储在数组插槽1中.如果您随后更改了键,它应该散列为2,但仍将存储在插槽1中!
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |