rust 通过宏在所有无符号整数上实现trait

bfrts1fy  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(64)

我一直在写一个数据存储模块,作为一个技术练习,以掌握一些基本的Rust,但我在实现一个trait时遇到了一些问题,该trait可以将不同的类型转换为可以存储在文本文件中的字符串。以无符号整数为例,我最初打算实现它如下:

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()
    }
}

字符串
然而,由于我之前在String上实现了DataFormatting,Rust警告String的冲突实现,因为“在未来的版本中,上游crates可能会为类型'std::string::String'添加一个新的特征'num_traits::Unsigned'的impl”。经过一些研究,它看起来像是支持未来的兼容性,我最好用宏自动列出相关类型,但是,作为Rust的新手,我不确定如何才能不太尴尬地做到这一点。

ergxz8rk

ergxz8rk1#

你可以用这样的宏来实现:

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);

字符串

相关问题