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

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

是否可以将特征作为参数传递给像这样的通用函数?

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

impl Fnord for i32 {}

// THIS IS WHAT DOESN'T COMPILE
fn iter_as<'a, T>(objs: &'a [i32]) -> impl Iterator<Item = & 'a dyn T>
{
    objs.iter().map(|o| o as &dyn T)
}

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

    // CALLS WOULD LOOK LIKE THIS
    for s in iter_as::<Fnord>(&objs) {
        println!("{}", s.do_it());
    }
}

也就是说,iter_as可以将特征作为通用参数接受,以便它可以返回该特征的可迭代对象吗?我已经搜索了很多答案,但是到现在为止,我觉得我可能在问错问题。

背景是这样的。我有一个结构,其中包含几个不同具体类型的向量,所有向量都实现相同的特征。我希望struct的impl具有一个函数,该函数可以将所有存储对象作为其任何共同特征返回可迭代。上面的iter_as是该(名义)功能的简化版本。也许我只是以一种尴尬的方式来处理生锈问题(例如,也许我想的太多了,就像C ++程序员一样),所以一种替代的惯用方法也很好。

generics rust traits
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.