有一些小例子,库代码我想用:如何解决这个“活不够长”?
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
,使其寿命短于t
。
我每晚使用rustc 1.19.0。
我不能够改变的lib代码。我只能改变我的代码。我有没有办法可以制作一个抽象fn foo(&mut self,callback:&'a mut F)'的特征? –
colinfang