次のコードで問題が何であるか誰にでも伝えられますか?コンパイラは寿命について不平を言っていますが、エラーメッセージはまったく意味がありません。私は考えることができるすべてを試しましたが、何も助けてくれないようです。Rustの特性オブジェクトの寿命との混同エラー
use std::borrow::BorrowMut;
trait Trait<'a> {
fn accept(&mut self, &'a u8);
}
struct Impl<'a>{
myref: Option<&'a u8>,
}
impl<'a> Trait<'a> for Impl<'a> {
fn accept(&mut self, inp: &'a u8) { self.myref = Some(inp); }
}
fn new<'a>() -> Box<Trait<'a> + 'a> {
Box::new(Impl{myref: None})
}
fn user<'a>(obj: &mut Trait<'a>) {}
fn parent<'a>(x: &'a u8) {
let mut pool = new();
user(pool.borrow_mut());
}
コンパイラエラーは全く意味がありません
error: `pool` does not live long enough
--> src/wtf.rs:22:10
|
22 | user(pool.borrow_mut());
| ^^^^ does not live long enough
23 | }
| - borrowed value dropped before borrower
|
= note: values in a scope are dropped in the opposite order they are created
です。借り手の残高はどうですか?私は借りた価値を使っていません!エラーメッセージへのよりがあることを
''b = 'x'の制限はどこから来ますか? – Antimony
申し訳ありませんが、私は誤って例+の固定バージョンを貼り付けました!明確にするために、 '& 'i mut(Trait <'x> +' x)'(引数)は '& 'b mut(Trait <'a> +' b)'(固定される前に 'user'の署名)で統一されています。これは、 '' b''が '' i''と '' x''の両方で統一されていることを意味します。 –
ああ、意味がある!私はおそらく、新しいものはおそらくTrait <'a> + 'bのようなものを返すべきだと思うが、コンパイラはそこに+ aがないと不平を言った。 – Antimony