Как сообщить Rust, что функция `num_traits :: pow :: Pow` уже реализована для моего настраиваемого трейта

Я хочу создать трейт, в котором говорится, что он реализует num_traits: : pow :: Pow - Ржавчина.

Моя черта в настоящее время определяется как:

pub trait PrimeSieveTrait:
  AddAssign + MulAssign + integer::Roots + FromPrimitive + ToPrimitive + PartialOrd + Copy {}
impl<T> PrimeSieveTrait for T
  where T:
    AddAssign + MulAssign + integer::Roots + FromPrimitive + ToPrimitive + PartialOrd + Copy {}

Типы T, которые меня волнуют, - это u32 и u64, в которых уже есть .pow() функция, реализованная в num_traits :: pow :: Pow - Rust, и которые возвращают u32 и u64. Как я могу изменить определение признака, чтобы работала указанная ниже функция?

fn test_case<T: PrimeSieveTrait>(p: T, x: u32) -> T {
  let one = T::from_u8(1).unwrap();
  p.pow(x) - one
}

person simonzack    schedule 01.10.2020    source источник
comment
Не могли бы вы просто добавить Pow<Output = Self> к существующим границам черт?   -  person Cerberus    schedule 01.10.2020
comment
@Cerberus Я только что попытался добавить Pow<T, Output = Self>, но он по-прежнему говорит, что метод не найден в T   -  person simonzack    schedule 01.10.2020


Ответы (1)


Ошибки Rust были весьма полезны:

error[E0599]: no method named `pow` found for type parameter `T` in the current scope
  --> src/common/divisor.rs:30:19
   |
30 |   let p_power = p.pow(x);
   |                   ^^^ method not found in `T`
   |
   = help: items from traits can only be used if the type parameter is bounded by the trait
help: the following traits define an item `pow`, perhaps you need to restrict type parameter `T` with one of them:
   |
26 | fn step_calc_divisors<T: rug::ops::Pow + PrimeSieveTrait>(divisors: &mut Vec<T>, strict_lower_bound: T, upper_bound: T, p: T, x: u32) {
   |                       ^^^^^^^^^^^^^^^^^^
26 | fn step_calc_divisors<T: num::PrimInt + PrimeSieveTrait>(divisors: &mut Vec<T>, strict_lower_bound: T, upper_bound: T, p: T, x: u32) {
   |                       ^^^^^^^^^^^^^^^^^
26 | fn step_calc_divisors<T: num::traits::Pow + PrimeSieveTrait>(divisors: &mut Vec<T>, strict_lower_bound: T, upper_bound: T, p: T, x: u32) {
   |                       ^^^^^^^^^^^^^^^^^^^^^

Попытка второго сработала:

pub trait PrimeSieveTrait:
  AddAssign + MulAssign + DivAssign + integer::Roots + PrimInt + FromPrimitive {}
impl<T> PrimeSieveTrait for T
  where T:
    AddAssign + MulAssign + DivAssign + integer::Roots + PrimInt + FromPrimitive {}
person simonzack    schedule 01.10.2020