< 返回版块

‘static 发表于 2024-08-16 15:18

闭包不用Option包裹时可以编译过,包裹后提示s生命周期不满足

struct P<'a> {
    v: Vec<&'a String>,
}

impl<'a> P<'a> {
    fn test<F: FnOnce(& mut P<'a>)+'a>(&mut self, f: Option<F>) {
        if let Some(f) = f {
            f(self);
        }
    }
}

fn main() {
    let s = "11".to_string();

    let mut p = P { v: vec![] };

    p.test(Some(|p: & mut P<'_>| {
        p.v.push(&s);
    }));

    println!("{:?}", p.v);
}

评论区

写评论
作者 ‘static 2024-08-16 18:40

谢谢,编译器无法识别的话只能是换个写法了

--
👇
TinusgragLin: 我 google 了一阵,好像是个老问题了,编译器在这种情况下似乎会变得很笨。如果你把那个 f 提出来先做为一个变量再传给没加 Option 的 test 函数,也会出现同样的错误提示:

let f = |x: &mut P<'_>| {
    p.v.push(&s);
};
p.test(f);

只能想法子给编译器一点提示了:

impl<'a> P<'a> {
    fn go_test<F: FnOnce(& mut P<'a>)>(&mut self, f: F) {
        self.test(Some(f))
    }
}
p.go_test(|p| {
    ...
})
// 或者:
impl<'a> P<'a> {
   fn hint_closure_type<F: FnOnce(&mut P<'a>)>(f: F) -> F { f }
}
p.test(Some(P::hint_closure_type(|p| {
    ...
})))
TinusgragLin 2024-08-16 17:38

我 google 了一阵,好像是个老问题了,编译器在这种情况下似乎会变得很笨。如果你把那个 f 提出来先做为一个变量再传给没加 Option 的 test 函数,也会出现同样的错误提示:

let f = |x: &mut P<'_>| {
    p.v.push(&s);
};
p.test(f);

只能想法子给编译器一点提示了:

impl<'a> P<'a> {
    fn go_test<F: FnOnce(& mut P<'a>)>(&mut self, f: F) {
        self.test(Some(f))
    }
}
p.go_test(|p| {
    ...
})
// 或者:
impl<'a> P<'a> {
   fn hint_closure_type<F: FnOnce(&mut P<'a>)>(f: F) -> F { f }
}
p.test(Some(P::hint_closure_type(|p| {
    ...
})))
1 共 2 条评论, 1 页