在使用相同变量的同时借用可变变量两次
Borrowing mutable twice while using the same variable
假设我正在通过一个向量(不一定是线性的,所以我不能只使用地图)并且我需要在满足某些条件时更改一个元素。我会考虑使用一些变量来跟踪我的位置,例如 current
变量
let mut v = vec![1, 2, 3, 4];
let mut current = &mut v[0];
然后检查 current
以了解是否需要更改某些条件。然而,当我这样做时
current = &mut v[1];
它给了我 cannot borrow v as mutable more than once at a time
。
我觉得这应该被允许,因为我只使用了一个变量,而且我不能再访问旧的借用了。
有什么方法可以让 rust 知道我正在归还第一次借用,所以我不会借用两次?还是我一直在想这个错误,我应该使用不同的 rust 惯用语?我已经通过对向量使用索引而不是可变引用来解决这个问题,但我认为 "traversing using a current
and then changing it" 的这个问题不仅仅是向量。如果我的数据结构没有索引怎么办?
如果要访问多个,则必须创建一个范围。
fn main() {
let mut vec = vec![2, 3, 5];
{
let mut current1 = vec.get_mut(1);
println!("{:?}", current1);
}
{
let mut current2 = vec.get_mut(2);
println!("{:?}", current2);
}
for i in 0..3 {
let mut current = vec.get_mut(i);
println!("{:?}", current);
}
}
可变引用一直存在,直到变量超出范围,因此您可以通过在每个引用周围放置块来依次进行多个可变引用:
fn do_stuff(n: &mut usize) {
*n += 1;
}
fn main() {
let mut v = vec![1, 2, 3, 4];
{
let current = &mut v[1];
do_stuff(current);
}
{
let current = &mut v[0];
do_stuff(current);
}
println!("{:?}", v);
}
这对于非词汇生命周期来说是不必要的,目前仅在夜间版本中可用:
#![feature(nll)]
fn do_stuff(n: &mut usize) {
*n += 1;
}
fn main() {
let mut v = vec![1, 2, 3, 4];
let mut current = &mut v[1];
do_stuff(current);
current = &mut v[0];
do_stuff(current);
println!("{:?}", v);
}
假设我正在通过一个向量(不一定是线性的,所以我不能只使用地图)并且我需要在满足某些条件时更改一个元素。我会考虑使用一些变量来跟踪我的位置,例如 current
变量
let mut v = vec![1, 2, 3, 4];
let mut current = &mut v[0];
然后检查 current
以了解是否需要更改某些条件。然而,当我这样做时
current = &mut v[1];
它给了我 cannot borrow v as mutable more than once at a time
。
我觉得这应该被允许,因为我只使用了一个变量,而且我不能再访问旧的借用了。
有什么方法可以让 rust 知道我正在归还第一次借用,所以我不会借用两次?还是我一直在想这个错误,我应该使用不同的 rust 惯用语?我已经通过对向量使用索引而不是可变引用来解决这个问题,但我认为 "traversing using a current
and then changing it" 的这个问题不仅仅是向量。如果我的数据结构没有索引怎么办?
如果要访问多个,则必须创建一个范围。
fn main() {
let mut vec = vec![2, 3, 5];
{
let mut current1 = vec.get_mut(1);
println!("{:?}", current1);
}
{
let mut current2 = vec.get_mut(2);
println!("{:?}", current2);
}
for i in 0..3 {
let mut current = vec.get_mut(i);
println!("{:?}", current);
}
}
可变引用一直存在,直到变量超出范围,因此您可以通过在每个引用周围放置块来依次进行多个可变引用:
fn do_stuff(n: &mut usize) {
*n += 1;
}
fn main() {
let mut v = vec![1, 2, 3, 4];
{
let current = &mut v[1];
do_stuff(current);
}
{
let current = &mut v[0];
do_stuff(current);
}
println!("{:?}", v);
}
这对于非词汇生命周期来说是不必要的,目前仅在夜间版本中可用:
#![feature(nll)]
fn do_stuff(n: &mut usize) {
*n += 1;
}
fn main() {
let mut v = vec![1, 2, 3, 4];
let mut current = &mut v[1];
do_stuff(current);
current = &mut v[0];
do_stuff(current);
println!("{:?}", v);
}