我一直在编写一个数据存储模块作为技术练习,以掌握一些基本的 Rust,但在实现将不同类型与可以存储在文本文件中的字符串之间进行转换的特征时,我遇到了一些问题。以无符号整数为例,我原本打算按如下方式实现:
impl<T: num_traits::sign::Unsigned> DataFormatting for T {
fn as_str_data(&self) -> String {
format!("{}", *self)
}
fn from_str_data(string_data: String) -> T {
string_data.parse::<T>().unwrap()
}
}
但是,由于我之前将 DataFormatting 实现为 String,Rust 警告 String 的实现存在冲突,因为“上游 crates 可能会在未来版本中为类型 'std::string::String' 添加一个新的特征 'num_traits::Unsigned' 实现” 。经过一些研究,它看起来像是支持未来的兼容性,我最好用宏自动列出相关类型,但是,作为 Rust 新手,我不确定如何以一种不会出现这种情况的方式做到这一点太尴尬了。
您可以使用这样的宏来做到这一点:
macro_rules! impl_DataFormatting {
( $($type:ty),* $(,)? ) => {
$(
impl DataFormatting for $type {
fn as_str_data(&self) -> String {
format!("{}", *self)
}
fn from_str_data(string_data: String) -> Self {
string_data.parse::<Self>().unwrap()
}
}
)*
};
}
impl_DataFormatting!(u8, u16, u32, u64, u128, usize);