Rust 为闭包实现一个trait会导致绑定/具体的生命周期不匹配

Rust 为闭包实现一个trait会导致绑定/具体的生命周期不匹配,rust,traits,lifetime,Rust,Traits,Lifetime,我想为特定类型的闭包实现一个特性。下面是一个最小的示例(): 但这没用。我还在impl块上声明了生存期,如下所示: where F: for<'a> Fn(&'a u32) impl<'a, F> Foo for F where F: Fn(&'a u32) { ... } impl免责声明:我不知道我在做什么 以下工作: trait Foo<'a> { fn foo(&self, x: &'a u32);

我想为特定类型的闭包实现一个特性。下面是一个最小的示例():

但这没用。我还在
impl
块上声明了生存期,如下所示:

where F: for<'a> Fn(&'a u32)
impl<'a, F> Foo for F
    where F: Fn(&'a u32) { ... }

impl免责声明:我不知道我在做什么

以下工作:

trait Foo<'a> {
    fn foo(&self, x: &'a u32);
}

impl<'a, F> Foo<'a> for F where F: Fn(&'a u32) {
    fn foo(&self, x: &'a u32) {
        self(x)
    }
}
F的特征Foo,其中F:Fn(&'a u32){ fn-foo(&self,x:&a u32){ 自我(x) } }
检查这部分错误:

[…]实现trait
std::ops::Fn
,但是的trait
是必需的

我认为基本上没有足够的代码来允许正确推断类型。添加显式类型注释可以编译示例:

let _: &Foo          = &|x: &u32| {};

以下是部分答案,从一个有趣的实验开始:

trait Foo {
    fn foo(&self, x: &u32);
}

impl<F> Foo for F
    where F: Fn(&u32)
{
    fn foo(&self, x: &u32) {
        self(x)
    }
}

fn main() {
    let f1: &Fn(&u32) = &|_x| {}; 
    let f2: &Foo = &f1;
    // but this fails:
    // let f3: &Foo = &|_x| {};
    f2.foo(&3);
}
trait Foo{
fn foo(&self,x:&u32);
}
对F的impl-Foo
其中F:Fn(&u32)
{
fn foo(&self,x:&u32){
自我(x)
}
}
fn main(){
设f1:&Fn(&u32)=&;
设f2:&Foo=&f1;
//但这失败了:
//设f3:&Foo=&|ux |{;
f2.foo和3;
}
()

我所做的只是将
FnOnce
更改为
Fn
,以与trait保持一致,并将您的第一个闭包分配给类型为
&Foo
的绑定,而这一个就起作用了


这告诉我trait本身是好的——在创建trait对象时,推断闭包的类型是个问题。回到错误,我们被告知闭包实现了
std::ops::Fn
,但是需要
for
。这意味着您尝试的第一件事(添加
以使用trait(例如
让f:&Foo=&x{};f.Foo(&3);
)使用此解决方案变得不可能。好吧,它超出了我的能力级别-只是认为您可能没有签出此选项。嗯,那么为什么编译器不能推断出来呢?@ChrisEmerson我也对此感兴趣!您和Shepmaster的答案已经帮到我了!添加显式类型在我的情况下不是很糟糕,现在它可以工作了。它确实是difF决定接受哪个答案的结果:<…可能是可以解释类型推断失败原因的答案^_^
trait Foo {
    fn foo(&self, x: &u32);
}

impl<F> Foo for F
    where F: Fn(&u32)
{
    fn foo(&self, x: &u32) {
        self(x)
    }
}

fn main() {
    let f1: &Fn(&u32) = &|_x| {}; 
    let f2: &Foo = &f1;
    // but this fails:
    // let f3: &Foo = &|_x| {};
    f2.foo(&3);
}