просматривая руководства насчет 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>
?