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)
}
}
检查这部分错误:
[…]实现traitstd::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);
}