【发布时间】:2021-05-08 07:24:12
【问题描述】:
假设我有一个结构,我想将它散列成 2 个HashMaps,这样第一个拥有对它的引用,而第二个拥有它,就像这样:
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 无关,为什么会发生这种情况?
【问题讨论】:
-
"这工作正常,符合预期。"实际上,我认为您应该对此感到惊讶。您正在引用一些局部变量,然后在引用仍然存在时将其移动到其他地方。我不确定你会期望这样做。
标签: rust reference borrow-checker ownership borrowing