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特征的情况下实现这一目标?
我鼓励您回去重读《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将迭代器转换为集合,而不是手动推送元素。也可以看看: