特质别名目前不在稳定的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>
子句,我刚刚了解到的所有方法都失败了。
如何使我的代码编译?
要使其编译,可以在闭包中添加类型注释: