提问人:Snowfallen 提问时间:11/14/2023 最后编辑:Kevin ReidSnowfallen 更新时间:11/15/2023 访问量:40
通过宏在所有无符号整数上实现 trait
Implement trait on all unsigned integers through a macro
问:
我一直在编写一个数据存储模块作为技术练习,以掌握一些基本的 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()
}
}
但是,由于我之前在 上实现了,Rust 警告了冲突的实现,因为“上游 crate 可能会在未来的版本中为类型 'std::string::String' 添加一个新的 trait 'num_traits::Unsigned' impl”。经过一些研究,似乎是为了支持未来的兼容性,我最好使用宏自动列出相关类型,但是,作为 Rust 的新手,我不确定如何以一种不会太尴尬的方式做到这一点。DataFormatting
String
String
答:
0赞
Chayim Friedman
11/14/2023
#1
您可以使用如下所示的宏来执行此操作:
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);
下一个:返回泛型类型的 Rust 函数
评论