Rust 如何在不使用Box的情况下从trait方法返回匿名类型?

Rust 如何在不使用Box的情况下从trait方法返回匿名类型?,rust,Rust,我有一个扩展特性,其方法只是适配器/组合器的简写: fn foo(self) -> ... { self.map(|i| i * 2).foo().bar() } Trait::foo()的返回类型是一些嵌套的Map覆盖了所有现有的解决方案。您没有使用的一种方法是用函数指针替换闭包,然后使用类型别名(可选地包装为newtype)。这并不总是可能的,但由于您没有提供代码的详细信息,我们无法判断这是否适用于您: use std::iter; type Thing<T> = it

我有一个扩展特性,其方法只是适配器/组合器的简写:

fn foo(self) -> ... { self.map(|i| i * 2).foo().bar() }
Trait::foo()
的返回类型是一些嵌套的
Map覆盖了所有现有的解决方案。您没有使用的一种方法是用函数指针替换闭包,然后使用类型别名(可选地包装为newtype)。这并不总是可能的,但由于您没有提供代码的详细信息,我们无法判断这是否适用于您:

use std::iter;

type Thing<T> = iter::Map<iter::Filter<T, fn(&i32) -> bool>, fn(i32) -> i32>;

trait IterExt: Iterator<Item = i32> {
    fn thing(self) -> Thing<Self>
    where
        Self: Sized + 'static,
    {
        // self.filter(|&v| v > 10).map(|v| v * 2)
        fn a(v: &i32) -> bool { *v > 10 }
        fn b(v: i32) -> i32 { v * 2 }
        self.filter(a as fn(&i32) -> bool).map(b as fn(i32) -> i32)
    }
}

impl<I> IterExt for I
where
    I: Iterator<Item = i32>,
{}

fn main() {}
使用std::iter;
类型Thing=iter::Map,fn(i32)->i32>;
trait-IterExt:迭代器{
事物(自我)->事物
哪里
自:大小+'静态,
{
//self.filter(|&v | v>10).map(| v | v*2)
fn a(v:&i32)->bool{*v>10}
fnb(v:i32)->i32{v*2}
self.filter(a作为fn(&i32)->bool.map(b作为fn(i32)->i32)
}
}
为我祈祷
哪里
I:迭代器,
{}
fn main(){}


老实说,在这些情况下,我会创建一个新类型来包装装箱的trait对象。这样,当实际可行时,我可以灵活地在内部以API兼容的方式使用非装箱选项重新实现它。

谢谢。我在考虑fn指针和类型别名,但似乎有很多类型。我希望能得到某种魔杖。下面是一个稍大的示例:
ChildStatusBound
-Trait可以应用于任何
futures::Stream
,但现在需要装箱。什么是“新类型”?@hippietrail