【发布时间】:2020-05-08 03:19:37
【问题描述】:
Trait 别名现在还不是稳定的 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 上的完整示例。)
正如所评论的,使用别名的函数不会接受我要传递的参数。我想我需要在特征定义中手动插入一些生命周期来模拟编译器在解析 process_data_2 时隐式执行的操作,但我不知道如何继续(我尝试插入 for<'a> 子句,我刚刚了解到的,都失败了)。
如何编译我的代码?
【问题讨论】:
标签: rust closures traits lifetime