rust - Rust不能在hashmap中插入不同的结构

标签 rust reference borrow-checker ownership borrowing

假设我有一个结构体,并且想将其散列为2个HashMap,这样第一个结构体就拥有对该结构体的引用,而第二个结构体则具有对它的引用,如下所示:

struct Person { id: i32 }

fn main() -> std::io::Result<()> {
    let mut first_name_table = HashMap::new();
    let mut last_name_table = HashMap::new();

    let person1 = Person { id: 1};
    let first_name1 = "first1";
    let last_name1 = "last1";

    last_name_table.insert(last_name1, &person1);
    first_name_table.insert(first_name1, person1);

    Ok(())
}
这可以正常工作,并且符合预期。但是,当我尝试插入第二个人时,借阅检查器会出现以下错误:
struct Person { id: i32 }

fn main() -> std::io::Result<()> {
    let mut first_name_table = HashMap::new();
    let mut last_name_table = HashMap::new();

    let person1 = Person { id: 1};
    let first_name1 = "first1";
    let last_name1 = "last1";

    last_name_table.insert(last_name1, &person1);
    first_name_table.insert(first_name1, person1);
    
    let person2 = Person { id: 2};
    let first_name2 = "first2";
    let last_name2 = "last2";

    last_name_table.insert(last_name2, &person2);
    first_name_table.insert(first_name2, person2);

    Ok(())
}
我得到的错误是:
error[E0505]: cannot move out of `person1` because it is borrowed
  --> src/main.rs:20:42
   |
19 |     last_name_table.insert(last_name1, &person1);
   |                                        -------- borrow of `person1` occurs here
20 |     first_name_table.insert(first_name1, person1);
   |                                          ^^^^^^^ move out of `person1` occurs here
...
26 |     last_name_table.insert(last_name2, &person2);
   |     --------------- borrow later used here
但是第26行与person1无关,那么为什么会发生这种情况?

最佳答案

当您将person1移至first_name_table时,会使存储在&person1中的引用last_name_table无效,但是如果您从不再次使用last_name_table,则编译器将使该代码编译,但是一旦您尝试使用last_name_table,该编译器将引发错误,因为它包含无效的引用。无论何时或尝试使用它,都没有关系。即使只是删除它也会触发错误:

use std::collections::HashMap;

struct Person { id: i32 }

fn main() -> std::io::Result<()> {
    let mut first_name_table = HashMap::new();
    let mut last_name_table = HashMap::new();

    let person1 = Person { id: 1};
    let first_name1 = "first1";
    let last_name1 = "last1";

    last_name_table.insert(last_name1, &person1);
    first_name_table.insert(first_name1, person1);
    
    drop(last_name_table); // triggers error

    Ok(())
}

关于rust - Rust不能在hashmap中插入不同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66038087/

相关文章:

import - 如何使用条件编译对 Rust 中的导入进行分组?

c++ - 为什么 const double reference 可以分配给 int 而不是 non const ?

c++ - 在 C++ 中,为什么使用或不使用引用作为结果值会得到不同的结果?

rust - 如何模式匹配包含 &mut 枚举的元组,并在一个匹配臂中使用枚举并在另一个匹配臂中使用递归调用?

postgresql - 如何使用 Diesel 更新现有对象? "` T : Identifiable` is not satisfied"

get - 在 Rust HashMap 中返回精确值

oop - Rust 特征对象的 &self 不能在特征默认函数中使用

Objective-c 符号 ** & +-

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - T <'a>: ' b 是 'a: ' b 的语法糖吗?