Generics 泛型函数可以用特征参数化吗?

Generics 泛型函数可以用特征参数化吗?,generics,rust,traits,Generics,Rust,Traits,是否可以将特征作为参数传递给这样的泛型函数 trait-Fnord{ fn do_it(&self)->i32{42} } i32{}的impl Fnord fn iter_as impl迭代器(objs:&'a[i32])->impl迭代器T必须是一种具体类型,而不是特征。我认为,与您所寻找的内容越接近的是: trait Fnord { fn do_it(&self) -> i32; } impl Fnord for i32 { fn do_it(&se

是否可以将特征作为参数传递给这样的泛型函数

trait-Fnord{
fn do_it(&self)->i32{42}
}
i32{}的impl Fnord

fn iter_as impl迭代器(objs:&'a[i32])->impl迭代器
T
必须是一种具体类型,而不是特征。我认为,与您所寻找的内容越接近的是:

trait Fnord {
    fn do_it(&self) -> i32;
}

impl Fnord for i32 {
    fn do_it(&self) -> i32 {
        *self
    }
}

impl<'a> From<&'a i32> for &'a dyn Fnord {
    fn from(i: &'a i32) -> Self {
        i as _
    }
}

fn iter_as<'a, T, TObj>(objs: &'a [T]) -> impl Iterator<Item = TObj> + 'a
where
    TObj: 'a,
    TObj: From<&'a T>,
{
    objs.iter().map(|o| o.into())
}

fn main() {
    let objs: Vec<i32> = vec![1, 2, 3];

    for s in iter_as::<i32, &dyn Fnord>(&objs) {
        println!("{}", s.do_it()); // 1 2 3
    }
}

我认为你想要HRTB。这在锈菌中是不存在的,看起来锈菌()中存在某种形式的HRTB,但它似乎专注于将无法确定的生命周期应用于性状。也许我没抓住重点。这怎么能让我把traits作为泛型参数传递呢?我刚才说的是排名N的类型,但也许我错了,你的MCVE不好,你可能会暴露你真正的问题“背景是这样的。我有一个结构,有几个不同具体类型的向量,它们都实现了相同的特性。我希望结构的impl有一个函数,可以返回所有存储对象上的iterable作为它们的任何共同特征。“,如果您想要一个惯用的解决方案,您必须生成一个显示您的需求的MCVE。因为对于像我这样的人来说,英语不好的地方并不清楚。特别是结尾不清楚。对,YourObject结构及其对chain()的使用与我所使用的非常相似。需要从一个类型实现到它实现的一个特性似乎有点迟钝/冗余,但我想从更大的角度来看,这是一个很好的理由。@abingham是的,我知道。。。不幸的是,不可能将
编写为
边界。我更新了我的答案,以展示宏如何简化样板文件。
trait Fnord {
    fn do_it(&self) -> i32;
}

impl Fnord for i32 {
    fn do_it(&self) -> i32 {
        *self
    }
}

impl<'a> From<&'a i32> for &'a dyn Fnord {
    fn from(i: &'a i32) -> Self {
        i as _
    }
}

struct YourObject {
    v1: Vec<i32>,
    v2: Vec<i32>,
}

impl YourObject {
    fn iter_as<'a, T>(&'a self) -> impl Iterator<Item = T> + 'a
    where
        T: From<&'a i32>, // Add the other bounds you need
    {
        self.v1
            .iter()
            .map(|o| o.into())
            .chain(self.v2.iter().map(|o| o.into()))
    }
}

fn main() {
    let obj = YourObject {
        v1: vec![1, 2],
        v2: vec![3],
    };

    for s in obj.iter_as::<&dyn Fnord>() {
        println!("{}", s.do_it()); // 1 2 3
    }
}
macro_rules! impl_from_for_dyn_trait {
    ( $concrete:ty, $trait:path ) => {
        impl<'a> From<&'a $concrete> for &'a dyn $trait {
            fn from(c: &'a $concrete) -> Self {
                c as _
            }
        }
    }
}

impl_from_for_dyn_trait!(i32, Fnord);