Rust: impl From <_> для использования, u64, u32 и т. Д. - PullRequest
1 голос
/ 30 января 2020

Пусть S будет структурой. Я хочу реализовать From для всех типов uint. Есть ли краткий способ сделать это?

Например, я хочу написать этот код

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<S> for uint {
    fn from(s: S) -> uint {
        s.field_a + s.field_b    
    }
}

Моя первая мысль состояла в том, чтобы использовать черты, чтобы сгруппировать все метки а-ля как мы передаем черты в качестве параметров . Вот моя попытка:

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

Но это не сработает и выглядит неуверенно (не просто вещи, которые подразумевают From и Add).

Не знаю, откуда go отсюда! Любая помощь будет оценена!

1 Ответ

5 голосов
/ 30 января 2020

Макрос может работать. (детская площадка)

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