我有这种类型的一些从trait实现:
struct BEEData {
data: Vec<u8>
}
impl From<u8> for BEEData {
fn from(data: u8) -> BEEData {
BEEData{data: vec![data]}
}
}
目前我只有u8
,但我希望最终有更多,如u16,
u32or a plain
Vec '。
我怎么能写一个包装器函数使用from
在一种方式,我不需要重复它的from
转换的每个实用者类型?
我的意思是给定这个:
impl BEEData {
...
fn wrap(slice: Vec<u8>) -> Vec<BEEData> {
let mut bee_data = vec![];
for i in slice {
bee_data.push(BEEData::from(i));
}
bee_data
}
}
当我试图用T
代替u8
时,我与编译器进行了一场辩论,我不知道如何获胜。
因为我不知道如何表达T
应该是"任何类型,只要BEEData
实现了From<T>
">。
您可以将您的需求写成where
子句:
impl BEEData {
fn wrap<T>(slice: Vec<T>) -> Vec<BEEData>
where
BEEData: From<T>,
{
let mut bee_data = vec![];
for i in slice {
bee_data.push(BEEData::from(i));
}
bee_data
}
}
这仅仅意味着只要BEEData
实现了From<T>
,该函数对任何选择的T
都有效。
你也可以反过来写,因为如果From<T>
为BEEData
实现,Into<BEEData>
就会自动为T
实现:
impl BEEData {
fn wrap<T>(slice: Vec<T>) -> Vec<BEEData>
where
T: Into<BEEData>,
{
let mut bee_data = vec![];
for i in slice {
bee_data.push(i.into());
}
bee_data
}
}