내가 사용하고자하는 최소한의 예제 라이브러리 코드가있다 :이 문제를 해결하는 방법은 "충분히 길지 않습니다"?
struct MyR<'a> {
x: &'a str,
}
struct T {
x: &'static str,
}
impl T {
fn bar<'a>(&'a self) -> MyR {
MyR { x: self.x }
}
}
는 IS 다음 내 코드 :
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 자체, 콜백 : & 'a mut F)'와 같은 특성을 만들 수있는 방법이 없습니까? –
colinfang