Rust 类型不匹配解决 `for<'r> ...` 与闭包特征别名参数

Rust type mismatch resolving `for<'r> ...` with closure trait alias argument

Trait 别名目前在稳定的 Rust 中不可用,但我尝试通过

来模拟它们(为特定类型的闭包提供更好的名称)
trait MyCallback: FnMut(&u32) -> () { }

impl<F: FnMut(&u32) -> ()> MyCallback for F { }

这对我需要的其他类型的特征别名非常有效。但是当我尝试使用 trait 别名时,我遇到了无法解决的终生问题(?)。考虑以下两个重复函数,在第二种情况下,只是将 MyCallback 替换为它的 "definition"。

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> 子句,我刚学的,都失败了)。

如何让我的代码编译?

要使其编译,您可以在闭包中添加类型注释:

process_data(|_: &u32| ());

这似乎与 this longstanding issue 有关。

如果我理解你的 post,你正在尝试使用特征来创建 "callback" 类型。如果 确实如此,你最好使用函数别名,如下所示:

pub type MyCallback = fn(&u32) -> ();

fn process_data(mut f: MyCallback) -> () {
    f(&0)
}

您收到的错误消息是由于上述 nnnmmm posted 的问题...就在我输入此 post :p