錆については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;
}
を、私はそれのためには、錆のボローチェッカーがghibli
のボローがすでに終了していることを認識することができない、語彙自然だということを理解しています。
しかし、私は本当にこの問題を解決する方法を知りたいですか?何らかの形でRc<T>
またはBox<T>
を使用する必要がありますか?
いいえ: 'bob.buy_car(&civic)'は 'car'フィールドを上書きします。だから、借用チェッカーは "間違っている" ...私はそれがとても簡単だと思うが、間違っている。 –
ああ。はい、もちろん、あなたは正しいです。それを見落とさなければならない。 @MatthieuM。 – JDemler
。私の理解は、借用チェッカーはメソッドの内部を見ていない、それは宣言だけを見ています。たとえば、コンパイルされたライブラリのメソッドを使用することを考えてください。ソースコードはありません。 – hamstergene