В моей программе есть несколько функций, которые работают с общим целым числом. Они обычно имеют следующую форму:
use num::{FromPrimitive, Integer, ToPrimitive};
use std::cmp::Ord;
use std::ops::{Add, Mul};
fn function<'a, I>(n: &'a I) -> I
where
I: Integer + Clone + FromPrimitive + ToPrimitive,
for<'b> &'b I: Mul<Output = I> + Add<Output = I> + Ord,
{
}
Я хочу присвоить псевдониму требования общего типа:
I: Integer + Clone + FromPrimitive + ToPrimitive,
for<'b> &'b I: Mul<Output = I> + Add<Output = I> + Ord,
чтобы мне не приходилось каждый раз переписывать их. Сначала я думал, что макросы помогут, но похоже, что они не работают так, как в C, поэтому я искал другой путь.
Я нашел способ сделать это по первому требованию. Нужно применить реализацию по умолчанию к определенной характеристике для любого типа T.
trait GInteger: Integer + Clone + FromPrimitive + ToPrimitive {}
impl<T: Integer + Clone + FromPrimitive + ToPrimitive> GInteger for T {}
Тогда я могу просто написать:
I: GInteger
вместо
I: Integer + Clone + FromPrimitive + ToPrimitive,
Как мне псевдоним второго требования? Возможно ли это?
for<'b> &'b I: Mul<Output = I> + Add<Output = I> + Ord,