特性别名现在不在稳定的Rust中,但是我尝试通过以下方式模拟它们(为特定的闭包命名更好的名称)
trait MyCallback: FnMut(&u32) -> () { }
impl<F: FnMut(&u32) -> ()> MyCallback for F { }
这对于我需要的其他种类的特征别名非常有效。但是,当我尝试使用trait别名时,遇到了无法解决的终身问题(?)。考虑以下两个重复的函数,MyCallback
在第二种情况下仅将其替换为“定义”。
fn process_data(mut f: impl MyCallback) -> () {
f(&0)
}
fn process_data_2(mut f: impl FnMut(&u32) -> ()) -> () {
f(&0)
}
fn main() {
// Doesn't compile
process_data(|_| ());
// Compiles
process_data_2(|_| ());
}
(在Playground上的完整示例。)如前所述,使用别名的函数将不接受我想要传递的参数。我猜想我需要在trait定义中手动插入一些生存期,以模拟编译器在解析时隐式执行的操作process_data_2
,但我不知道该如何进行(我尝试了解的插入for<'a>
子句的尝试,全部失败)。
如何使我的代码编译?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句