当它是HashMap中的键时,是否可以修改可变向量?

Aka*_*all 4 rust

这是我的例子:

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.我的理解是否正确?我缺少一个技巧或角落案例吗?

She*_*ter 5

不,你不能修改它,即使你可以,你绝对不应该做这样的事情.

在您的示例中,您无法修改向量的原因是因为您不再拥有它.您已将其所有权转让给地图.这就是"使用移动价值"的意思.

假设你有一些修改地图键的方法(我不打算提供任何例子来帮助阻止人们这样做).主要的问题是你要打破一个不变的HashMap:

以这样一种方式修改密钥是一个逻辑错误:密钥的哈希值由哈希特征确定,或由等式特征确定的等式,在它在地图中时发生变化.

一旦了解了hashmaps的工作原理,这一点很简单.添加密钥时,会运行一个算法,将密钥转换为整数(密钥经过哈希处理).然后,此整数用于查找数组中的空间以存储该值.

如果更改了密钥,则该值将存储在数组中的错误位置.举一个简单的例子,假设向量的散列算法只是向量中的项目数.如果您添加vec![1]为键,它将存储在数组插槽1中.如果您随后更改了键,它应该散列为2,但仍将存储在插槽1中!