Rust类型不匹配,使用闭包特征别名自变量解析`for ...`

问题描述 投票:1回答:1

特质别名目前不在稳定的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>子句,我刚刚了解到的所有方法都失败了。

如何使我的代码编译?

rust traits lifetime
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.