Bei der Erstellung einer FooBuilder
, möchte ich eine &mut Bar
bereitstellen. Wenn ich Foo
baue, möchte ich eine &Bar
bereitstellen und Foo
sollte &self
Methoden von Bar
aufrufen können. Mit anderen Worten, der veränderbare Kredit sollte nur während der Lebenszeit von FooBuilder
existieren.Wie gebe ich einen veränderbaren Verweis auf einen Builder, aber nur einen unveränderlichen Verweis auf das erstellte Objekt?
struct FooBuilder<'a> {
bar: &'a mut Bar,
}
impl<'a> FooBuilder<'a> {
fn new(bar: &'a mut Bar) -> Self {
FooBuilder { bar: bar }
}
fn build(&'a self) -> Foo<'a> {
Foo { bar: &self.bar }
}
}
struct Foo<'a> {
bar: &'a Bar,
}
struct Bar;
impl Bar {
fn bar(&self) {}
}
fn main() {
let mut bar = Bar;
let foo = FooBuilder::new(&mut bar).build();
bar.bar();
}
Dieser Code hat den Fehler:
error: borrowed value does not live long enough
--> <anon>:24:15
|
24 | let foo = FooBuilder::new(&mut bar).build();
| ^^^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough
|
note: reference must be valid for the block suffix following statement 1 at 24:48...
--> <anon>:24:49
|
24 | let foo = FooBuilder::new(&mut bar).build();
| ^
note: ...but borrowed value is only valid for the statement at 24:4
--> <anon>:24:5
|
24 | let foo = FooBuilder::new(&mut bar).build();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: consider using a `let` binding to increase its lifetime
--> <anon>:24:5
|
24 | let foo = FooBuilder::new(&mut bar).build();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0502]: cannot borrow `bar` as immutable because it is also borrowed as mutable
--> <anon>:25:5
|
24 | let foo = FooBuilder::new(&mut bar).build();
| --- mutable borrow occurs here
25 | bar.bar();
| ^^^ immutable borrow occurs here
26 | }
| - mutable borrow ends here
error: aborting due to 2 previous errors
Was genau ist Ihre Frage? – antoyo
Es ist nicht die beste Etikette, Ihre Frage so zu modifizieren, dass bestehende Antworten ungültig werden. – Shepmaster
Ich glaube nicht, dass das möglich ist, sorry. Sie können einen veränderbaren Verweis nicht auf einen freigegebenen Verweis zurückstufen, um die gemeinsame Lebensdauer wiederherzustellen. – Veedrac