构造具有特征约束的任何类型的向量

时间:2014-12-17 04:32:07

标签: rust traits

我想要一个结构,其成员是一个Vec,在Vector中的类型上有一个Trait Constraint。现在,这就是我想要的:

pub trait SomeTrait {
    fn some_function(&self);
}

pub struct SomeStruct<T: SomeTrait> {
    member: Vec<T>
}

impl<T: SomeTrait> SomeStruct<T> {
    pub fn new() -> SomeStruct<T> {
        SomeStruct {
            member: Vec::new()
        }
    }
}

fn main() {
    let mut some_struct = SomeStruct::new();
}

编译器正在给我:

error: the trait 'sometrait::SomeTrait' is not implemented for the type '_'
let mut some_struct = SomeStruct::new();
                      ^~~~~~~~~~~
note: required by 'somestruct::SomeStruct<T>::new'
let mut some_struct = SomeStruct::new();
                      ^~~~~~~~~~~

我已经尝试将<T: SomeTrait>放在各个地方,但只是遇到更奇怪的编译错误,所以这些尝试必须偏离基础。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

问题是你没有给编译器足够的信息来确定T是什么。这就是_的用途:它必须将参数推断为SomeStruct

此外,此示例中没有任何类型可以实现SomeTrait。如果您解决了这两个问题,它可以工作(带有一些警告):

pub trait SomeTrait {
    fn some_function(&self);
}

pub struct SomeStruct<T: SomeTrait> {
    member: Vec<T>
}

impl<T: SomeTrait> SomeStruct<T> {
    pub fn new() -> SomeStruct<T> {
        SomeStruct {
            member: Vec::new()
        }
    }
}

impl SomeTrait for i32 {
    fn some_function(&self) {}
}

fn main() {
    let mut some_struct_a: SomeStruct<i32> = SomeStruct::new();
    let mut some_struct_b = SomeStruct::<i32>::new();
}