是否可以在Rust中为这样的函数在FnMut
上指定一个泛型生存期?
fn f1<'a, FRet:'a + FnMut() -> ()>(v: &'a mut i32) -> FRet {
let mut fret = || {
let i = v;
println!("inside");
// lots of complicated logic on captured var
*i = 5;
};
return fret;
}
现在我得到一个错误,返回与FRet
不兼容。
1条答案
按热度按时间wribegjk1#
你的代码有几个问题。一个是不能让返回闭包的函数具有泛型返回类型。
f1
比FRet
通用意味着调用者可以选择FRet
,当你返回一个你实现的闭包时,这显然是行不通的,而不是调用者可以或应该指定的东西。这就是为什么编译器会抱怨FRet
与您实际返回的内容不兼容。返回闭包的方法是将其装箱或使用
impl Trait
返回类型,该类型声明函数返回的未命名类型:上面的代码仍然无法编译,编译器抱怨闭包是
FnOnce
而不是FnMut
。这是因为&mut i32
不是Copy
,所以let i = v
实际上将引用移出了v
,这使得闭包只能调用一次。这可以通过再借款来解决,即。将let i = v
更改为let i = &mut *v
。之后,编译器会抱怨闭包没有捕获引用的生存期,你可以通过添加
+ '_
来修复这个问题。(这相当于声明了一个生存期'a
,并声明了v: &'a mut i32
和impl FnMut() + 'a
。)通过此更改,代码编译:Playground