私は借用チェッカーと戦っています。私は2つの同様のコード片を持っています。一つは私が期待していたもので、もう一つはそうではありません。誰が変数を借りましたか?
私が期待どおりに動作1:ない
mod case1 {
struct Foo {}
struct Bar1 {
x: Foo,
}
impl Bar1 {
fn f<'a>(&'a mut self) -> &'a Foo {
&self.x
}
}
// only for example
fn f1() {
let mut bar = Bar1 { x: Foo {} };
let y = bar.f(); // (1) 'bar' is borrowed by 'y'
let z = bar.f(); // error (as expected) : cannot borrow `bar` as mutable more
// than once at a time [E0499]
}
fn f2() {
let mut bar = Bar1 { x: Foo {} };
bar.f(); // (2) 'bar' is not borrowed after the call
let z = bar.f(); // ok (as expected)
}
}
1:私は、私はケース1のように、コンパイラを刺激せずに二回Bar2::f
を呼び出すことができます望ん
mod case2 {
struct Foo {}
struct Bar2<'b> {
x: &'b Foo,
}
impl<'b> Bar2<'b> {
fn f(&'b mut self) -> &'b Foo {
self.x
}
}
fn f4() {
let foo = Foo {};
let mut bar2 = Bar2 { x: &foo };
bar2.f(); // (3) 'bar2' is borrowed as mutable, but who borrowed it?
let z = bar2.f(); // error: cannot borrow `bar2` as mutable more than once at a time [E0499]
}
}
。
質問はコメント(3)にあります:誰がbar2
を借りたのですが、影響はありませんか?
は、ここで私は理解して何:
ケース1では、
f2
コール:寿命パラメータ'a
は受信&Foo
値の一つなので、何も気取りがない場合、この寿命は空で、bar
がありますBar1::f
コールの後に借りていない。ケース2では- は、
bar2
は
foo
(不変として)借用し、そう
Bar2
構造体の寿命パラメータ
'b
は
f4
本体の終わりで終了
foo
基準寿命です。
Bar2::f
を呼び出すと、その生涯、つまり
f4
の末尾には
bar2
が借ります。
しかし、質問はまだあります:誰が借りたbar2
?それはBar2::f
でしょうか?電話後にBar2::f
が借用所有権を保持する方法は?私はここで何が欠けていますか?
私はx86_64-pc-windows-msvcでRust 1.14.0-nightly(86affcdf6 2016-09-28)を使用しています。
この大雑把な経験則のために受け入れられました。ありがとう。 – jferard