在Rust中表达自定义类型转换的泛型方式?



我有这种类型的一些从trait实现:

struct BEEData {
data: Vec<u8>
}
impl From<u8> for BEEData {
fn from(data: u8) -> BEEData {
BEEData{data: vec![data]}
}
}

目前我只有u8,但我希望最终有更多,如u16,u32or a plainVec '。

我怎么能写一个包装器函数使用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
}
}

最新更新