【发布时间】:2018-08-20 16:39:14
【问题描述】:
在函数内部,我试图将一个值推入向量中,然后返回对该值的引用,该值位于向量内部。可悲的是,它不起作用,我收到以下错误:
error[E0502]: cannot borrow `vector` as immutable because it is also borrowed as mutable
--> src\lib.rs:19:19
|
18 | let _unit_0 = push_and_get(&mut vector);
| ----------- mutable borrow occurs here
19 | let _unit_1 = vector.last().unwrap();
| ^^^^^^ immutable borrow occurs here
20 | drop(_unit_0);
| ------- mutable borrow later used here
这是我的代码,其中包含两个函数(this_works、this_does_not_work),据我了解,它们执行相同的操作,但只有其中一个有效。
fn this_works() {
let mut vector = Vec::new();
vector.push(());
let _unit_0 = vector.last().unwrap();
let _unit_1 = vector.last().unwrap();
}
fn this_does_not_work() {
let mut vector = Vec::new();
let _unit_0 = push_and_get(&mut vector);
let _unit_1 = vector.last().unwrap();
drop(_unit_0); // Added, to make the error reappear
}
fn push_and_get(vector: &mut Vec<()>) -> &() {
vector.push(());
vector.last().unwrap()
}
由于 Rust 的限制,有什么方法可以让 push_and_get 函数工作还是不可能?如果是第一个,我怎样才能让它工作,如果是后者,是否有任何计划来解决这个特定问题,或者有什么好的理由不应该解决这个问题?
【问题讨论】:
-
做同样的事情 — Why doesn't the lifetime of a mutable borrow end when the function call is complete?; 有什么方法可以让 [它] 工作 — What are the options to end a mutable borrow in Rust?; 是否有解决此特定问题的计划 — What are non-lexical lifetimes?
-
@Shepmaster 这个问题不能通过非词法生命周期来解决。虽然当前代码可以工作,但现在,只要我添加手动删除,即我不允许编译器重新排序语句,以便在创建 _unit_0 之前删除 _unit_1,错误就会再次出现。
标签: rust borrow-checker