मैं उधार चेकर के साथ लड़ रहा हूं। मेरे पास कोड के दो समान टुकड़े हैं, एक काम कर रहा है जैसा कि मैं उम्मीद करता हूं, और दूसरा नहीं।किसने एक चर उधार लिया?
एक है कि काम करता है मैं उम्मीद के रूप में:
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)
}
}
एक है कि नहीं करता है:
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]
}
}
मैं आशा व्यक्त की मैं संकलक परेशान बिना दो बार Bar2::f
कह सकते हैं मामले में 1 के रूप में,।
प्रश्न टिप्पणी में है (3): bar2
उधार लिया, जबकि कोई प्रभाव नहीं है?
यहाँ मैं क्या समझ है:
मामले 1 में,
f2
कॉल: जीवन पैरामीटर'a
प्राप्त&Foo
मूल्य में से एक है, इसलिए इस जीवन में खाली है जब वहाँ कोई दिखावा है, औरbar
हैBar1::f
कॉल के बाद उधार नहीं लिया गया;मामले 2 में,
bar2
उधार लेता हैfoo
(अपरिवर्तनीय के रूप में) है, तो जीवन भर पैरामीटर'b
Bar2
struct मेंfoo
संदर्भ जीवन है, जोf4
शरीर के अंत में समाप्त होता है। उस जीवनकाल के लिएBar2::f
बोरोbar2
पर कॉल करना, अर्थात्f4
के अंत तक।
लेकिन सवाल अभी भी है: bar2
किसने उधार लिया? क्या यह Bar2::f
हो सकता है? कॉल के बाद उधार लिया स्वामित्व कैसे Bar2::f
होगा? मुझे यहां क्या समझ नहीं आ रहा है?
मैं x86_64-pc-windows-msvc पर जंग 1.14.0-रात (86affcdf6 2016-09-28) का उपयोग कर रहा हूं।
अंगूठे के इस मूल्यवान नियम के कारण स्वीकृत। धन्यवाद। – jferard