Как избежать повторяющихся длинных общих ограничений в Rust - PullRequest
12 голосов
/ 08 апреля 2019

Я пытаюсь сделать свою собственную реализацию больших целых чисел (только для образования).Реализация является общей для типа данных:

struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}

Проблема в том, что мне нужно повторить это подробное ограничение для T во всех имплсах.Это слишком громоздко.

Я могу создать свою собственную черту, комбинируя эти ограничения, например:

trait LongNumValue: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}

struct LongNum<T: LongNumValue>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}

Но в этом случае я должен добавить имплы для этой черты LongNumValue ко всем типам, которые могутиспользоваться в LongNum:

impl LongNumValue for u8 {}
impl LongNumValue for u16 {}
impl LongNumValue for u32 {}
...

Это означает, что если я не добавлю какой-либо тип в этот список значений, пользователь моего ящика не сможет использовать этот тип для LongNum, даже если этот типis проходит все ограничения.

Есть ли способ избежать написания длинных повторяющихся ценовых предложений без добавления ненужных ограничений для пользователя?

1 Ответ

19 голосов
/ 08 апреля 2019

Вы можете добавить полную реализацию :

impl<T> LongNumValue for T 
where
    T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...