Rust 锈蚀:从<_&燃气轮机;用于usize、u64、u32等

Rust 锈蚀:从<_&燃气轮机;用于usize、u64、u32等,rust,type-conversion,Rust,Type Conversion,让我们做一个结构。我想为所有uint类型实现From。有没有简单的方法可以做到这一点 例如,我想写这段代码 impl From<S> for usize { fn from(s: S) -> usize { s.field_a + s.field_b } } impl From<S> for u64 { fn from(s: S) -> u64 { s.field_a + s.field_b

让我们做一个结构。我想为所有uint类型实现From。有没有简单的方法可以做到这一点

例如,我想写这段代码

impl From<S> for usize {
    fn from(s: S) -> usize {
        s.field_a + s.field_b    
    }
}

impl From<S> for u64 {
    fn from(s: S) -> u64 {
        s.field_a + s.field_b    
    }
}

impl From<S> for u32 {
    fn from(s: S) -> u32 {
        s.field_a + s.field_b    
    }
}

...
impl From供使用{
fn from(s:s)->使用{
s、 场a+s场b
}
}
u64的impl From{
fn从(s:s)->u64{
s、 场a+s场b
}
}
u32的impl From{
fn从(s:s)->u32{
s、 场a+s场b
}
}
...
作为

impl From for uint{
fn来自(s:s)->uint{
s、 场a+s场b
}
}
我的第一个想法是用性格特征把所有的UINT分类。以下是我的尝试:

use std::ops::Add;

impl From<S> for impl From + Add {
    fn from<T: From + Add>(s: S) -> T {
        T::from(s.field_a) + T::from(s.field_b)
    }
}
使用std::ops::Add;
impl From用于impl From+Add{
fn从(s:s)->T{
T::from(s.field_a)+T::from(s.field_b)
}
}
但这不起作用,而且感觉很简陋(UINT不仅仅是来自和添加的东西)

不知道从这里到哪里去!任何帮助都将不胜感激

宏可以工作

结构{
字段a:u8,
字段b:u8,
}
宏规则!从{
($($uint\U类型:ty),*)=>{
$(
$uint\U类型的impl From{
fn从(s:s)->$uint\u类型{
:from(s.field_a)+:from(s.field_b)
}
}
)*
}
}
向我们恳求!(u8、u16、u32、u64、u128);
宏可以工作

结构{
字段a:u8,
字段b:u8,
}
宏规则!从{
($($uint\U类型:ty),*)=>{
$(
$uint\U类型的impl From{
fn从(s:s)->$uint\u类型{
:from(s.field_a)+:from(s.field_b)
}
}
)*
}
}
向我们恳求!(u8、u16、u32、u64、u128);

这看起来很有效,但我有点失望,没有更简单的方法。如果没有人想出更简单的办法,我会在几天后接受这个答案。我只想回来说声谢谢!我一直在用这个答案!这看起来很有效,但我有点失望没有更简单的方法。如果没有人想出更简单的办法,我会在几天后接受这个答案。我只想回来说声谢谢!我一直在用这个答案!
use std::ops::Add;

impl From<S> for impl From + Add {
    fn from<T: From + Add>(s: S) -> T {
        T::from(s.field_a) + T::from(s.field_b)
    }
}
struct S {
    field_a: u8,
    field_b: u8,
}

macro_rules! impl_from_s {
    ($($uint_type: ty),*) => {
        $(
            impl From<S> for $uint_type {
                fn from(s: S) -> $uint_type {
                    <$uint_type>::from(s.field_a) + <$uint_type>::from(s.field_b)
                }
            }
        )*
    }
}

impl_from_s!(u8, u16, u32, u64, u128);