函数如何要求类型实现特征而不删除现有特征界限?

Sli*_*ady 0 generics struct traits type-parameter rust

我正在尝试返回具有特征main_func的类型结构的向量TSrObject

struct TestA {
    value: u8,
}

pub trait SrObject {
    fn myfunc(&mut self);
}
impl SrObject for TestA {
    fn myfunc(&mut self) {
        unimplemented!();
    }
}
impl Default for TestA {
    fn default() -> TestA {
        TestA { value: 3u8 }
    }
}

fn main_func<T: SrObject>(t: T) -> Vec<T> {
    let mut v = Vec::<T>::new();
    for i in 0..10 {
        v.push(T::default());
        //v[i].myfunc();
    }
    return v;
}
Run Code Online (Sandbox Code Playgroud)

它给:

struct TestA {
    value: u8,
}

pub trait SrObject {
    fn myfunc(&mut self);
}
impl SrObject for TestA {
    fn myfunc(&mut self) {
        unimplemented!();
    }
}
impl Default for TestA {
    fn default() -> TestA {
        TestA { value: 3u8 }
    }
}

fn main_func<T: SrObject>(t: T) -> Vec<T> {
    let mut v = Vec::<T>::new();
    for i in 0..10 {
        v.push(T::default());
        //v[i].myfunc();
    }
    return v;
}
Run Code Online (Sandbox Code Playgroud)

Default我知道我在 fn 中没有该特征main_func<T: SrObject>,但是如何在不删除该SrObject特征的情况下实现这一目标?

She*_*ter 5

我鼓励您回去重读《Rust 编程语言》。这是 Rust 社区创建的一本免费在线书籍,涵盖了成为一名成功的 Rust 程序员所需了解的广泛知识。

在这种情况下,有关特征的章节提到了有关特征边界的内容:

我们可以使用 来在泛型类型上指定多个特征边界+。如果我们需要能够在T函数和summary方法中的类型上使用显示格式,我们可以使用特征边界T: Summarizable + Display。这意味着可以是同时实现和T的任何类型。SummarizableDisplay

对于你的情况:

fn main_func<T: SrObject + Default>() -> Vec<T> {
    (0..10).map(|_| T::default()).collect()
}
Run Code Online (Sandbox Code Playgroud)

或者

fn main_func<T>() -> Vec<T>
where
    T: SrObject + Default,
{
    (0..10).map(|_| T::default()).collect()
}
Run Code Online (Sandbox Code Playgroud)

使其更符合习惯的其他更改:

  • v调用时不指定类型Vec::new;就会被推断出来。
  • 不要return在函数末尾使用显式。
  • 使用Iterator::mapandIterator::collect将迭代器转换为集合,而不是手动推送元素。

也可以看看: