如何告诉 Rust 编译器借用已经结束?
How to tell the Rust compiler that a borrow has ended?
在 checking out tutorials 关于 Rust 时,我遇到了借用检查器的问题。以下代码无法编译:
struct Car {
model: String,
}
struct Person<'a> {
car: Option<&'a Car>,
}
impl<'a> Person<'a> {
fn new() -> Person<'a> {
Person { car: None }
}
fn buy_car(&mut self, c: &'a Car) {
// how to say that Person don't borrow the old car any longer?
self.car = Some(c);
}
}
fn main() {
let civic = Car { model: "Honda Civic".to_string() };
let mut ghibli = Car { model: "Maserati Ghibli".to_string() };
let mut bob = Person::new();
bob.buy_car(&ghibli);
bob.buy_car(&civic);
// error: cannot borrow `ghibli` as mutable because it is also borrowed as immutable
let anything = &mut ghibli;
}
我明白,由于它的词法性质,Rust 的借用检查器无法识别 ghibli
的借用已经结束。
但我真的很想知道如何用 Rust 方式解决这个问题?我必须以某种方式使用 Rc<T>
或 Box<T>
吗?
告诉借用检查器借用结束的"Rust way"是引入一个新范围:
fn main() {
let civic = Car{model: "Honda Civic".to_string()};
let mut ghibli = Car{model: "Maserati Ghibli".to_string()};
{
let mut bob = Person::new();
bob.buy_car(&ghibli);
bob.buy_car(&civic);
}
let anything = &mut ghibli;
}
但您必须意识到,在您的示例中(可能在大多数情况下)借用检查器是正确的。
Bob
借用了对 ghibli
的引用。它仍然存在于他的 car
字段中主要方法的末尾。
在这种情况下,静态借用规则不起作用,因为存在您无法告知编译器的动态行为。
您需要使用Rc<T>
,它可以在运行时进行借用检查;或者,如果您需要可变访问权限,则 Rc<Cell<T>>
或 Rc<RefCell<T>>
。那么只要以动态安全的方式访问就万事大吉了。
在 checking out tutorials 关于 Rust 时,我遇到了借用检查器的问题。以下代码无法编译:
struct Car {
model: String,
}
struct Person<'a> {
car: Option<&'a Car>,
}
impl<'a> Person<'a> {
fn new() -> Person<'a> {
Person { car: None }
}
fn buy_car(&mut self, c: &'a Car) {
// how to say that Person don't borrow the old car any longer?
self.car = Some(c);
}
}
fn main() {
let civic = Car { model: "Honda Civic".to_string() };
let mut ghibli = Car { model: "Maserati Ghibli".to_string() };
let mut bob = Person::new();
bob.buy_car(&ghibli);
bob.buy_car(&civic);
// error: cannot borrow `ghibli` as mutable because it is also borrowed as immutable
let anything = &mut ghibli;
}
我明白,由于它的词法性质,Rust 的借用检查器无法识别 ghibli
的借用已经结束。
但我真的很想知道如何用 Rust 方式解决这个问题?我必须以某种方式使用 Rc<T>
或 Box<T>
吗?
告诉借用检查器借用结束的"Rust way"是引入一个新范围:
fn main() {
let civic = Car{model: "Honda Civic".to_string()};
let mut ghibli = Car{model: "Maserati Ghibli".to_string()};
{
let mut bob = Person::new();
bob.buy_car(&ghibli);
bob.buy_car(&civic);
}
let anything = &mut ghibli;
}
但您必须意识到,在您的示例中(可能在大多数情况下)借用检查器是正确的。
Bob
借用了对 ghibli
的引用。它仍然存在于他的 car
字段中主要方法的末尾。
在这种情况下,静态借用规则不起作用,因为存在您无法告知编译器的动态行为。
您需要使用Rc<T>
,它可以在运行时进行借用检查;或者,如果您需要可变访问权限,则 Rc<Cell<T>>
或 Rc<RefCell<T>>
。那么只要以动态安全的方式访问就万事大吉了。