我正在尝试使用main_func
返回带有T
特征的SrObject
结构类型的向量
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;
}
它给出了:
error[E0599]: no function or associated item named `default` found for type `T` in the current scope
--> src/main.rs:22:16
|
22 | v.push(T::default());
| ^^^^^^^^^^ function or associated item not found in `T`
|
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `default`, perhaps you need to implement it:
candidate #1: `std::default::Default`
我知道fn Default
中没有main_func<T: SrObject>
特征,但如何在不删除SrObject
特征的情况下实现此目标?
答案 0 :(得分:4)
我鼓励你回去重新阅读The Rust Programming Language。这是Rust社区创建的免费在线书籍,涵盖了成为一名成功的Rust程序员需要了解的各种内容。
在这种情况下,chapter on traits提及trait bounds:
我们可以使用
+
在泛型类型上指定多个特征边界。如果我们需要能够在函数中使用T
类型的显示格式以及summary
方法,我们可以使用特征边界T: Summarizable + Display
。这意味着T
可以是同时实现Summarizable
和Display
的任何类型。
对于你的情况:
fn main_func<T: SrObject + Default>() -> Vec<T> {
(0..10).map(|_| T::default()).collect()
}
或者
fn main_func<T>() -> Vec<T>
where
T: SrObject + Default,
{
(0..10).map(|_| T::default()).collect()
}
使其成为惯用语的其他变化:
v
时,请勿指定Vec::new
的类型;它将被推断出来。return
。Iterator::map
和Iterator::collect
将迭代器转换为集合,而不是手动推送元素。另见: