あり、私が使用したいいくつかの最小限のサンプル・ライブラリーのコードは次のとおりです。これを解決するには "十分に長く生きていません"?
struct MyR<'a> {
x: &'a str,
}
struct T {
x: &'static str,
}
impl T {
fn bar<'a>(&'a self) -> MyR {
MyR { x: self.x }
}
}
次は私のコードです:
trait A<R, F: FnMut(&R)> {
fn foo(&mut self, callback: &mut F);
}
impl<'a, F> A<MyR<'a>, F> for T
where F: FnMut(&MyR<'a>)
{
fn foo(&mut self, callback: &mut F) {
let t = T { x: "l" };
let r = t.bar(); // t does not live long enough (for 'a)
callback(&r);
println!("abc");
}
}
fn test() {
let mut t = T { x: "l" };
let mut i = 1;
t.foo(&mut |x| { i += x.x.len(); });
}
私はコールバックによってパラメータ化された形質をしたいと思いますが、私はそれを正しくするために苦労した。
impl T {
fn foo<F: FnMut(&MyR)>(&mut self, callback: &'a mut F) {
let t = T { x: "l" };
let r = t.bar();
callback(&r);
println!("abc");
}
}
しかし、私はこれを行うことはできません:私は形質を使用しない場合は、それがうまく機能
impl T {
fn foo<'a, F: FnMut(&MyR<'a>)>(&mut self, callback: &mut F) {
let t = T { x: "l" };
let r = t.bar();
callback(&r);
println!("abc");
}
}
私はこの問題は、t
が'a
より長生きしなければならないということですけど、私は知りませんよりも寿命が短くなるように'a
にバインドしてください。
私はrustc 1.19.0を毎晩使用しています。
私はlibにコードを変更することはできませんよ。私は自分のコードを変更することしかできません。 'fn foo(&mut self、コールバック:& 'a mut F)'という抽象的な特性を作り出す方法はありませんか? –
colinfang