Как выбрать константу в соответствии с универсальным в Rust? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь работать над математической библиотекой, которая имеет константы и функции. Что мне нужно сделать, чтобы связать значение с чертой, которая использует дженерики?

Функции в моем проекте Rust 1.30.0, в котором в качестве параметров используются обобщения, и мне нужно, чтобы константы соответствовали типу T, чтобы я мог работать с ними в функции (здесь я также использую число ящиков) :

use num_traits as ntraits; // 0.2.6
use std::{f32, f64};

pub trait consts<T> {
    const INGA: T;
}

impl<T> consts<f32> for T {
    const INGA: f32 = f32::consts::FRAC_2_SQRT_PI;
}

impl<T> consts<f64> for T {
    const INGA: f64 = f64::consts::FRAC_2_SQRT_PI;
}

pub struct CMPS<T> {
    pub a: T,
    pub b: T,
}

pub type CMPS32 = CMPS<f32>;
pub type CMPS64 = CMPS<f64>;

impl<T: Clone + ntraits::Float + ntraits::FromPrimitive> CMPS<T> {

    pub fn cerf(a: T, b: T) -> CMPS<T> {
        let pr: T = consts::INGA;
        let rtr = a;
        let rti = b;
        CMPS { a: rtr, b: rti }
    }
}

Но когда я пытаюсь выполнить эту привязку, ожидаю, что pr будет того же типа, что и T, и будет соответствовать значению INGA, как это:

let pr: T = consts::INGA;

Выводит только ошибки типа:

error[E0283]: type annotations required: cannot resolve `_: consts<T>`
  --> src/lib.rs:27:21
   |
27 |         let pr: T = consts::INGA;
   |                     ^^^^^^^^^^^^
   |
note: required by `consts::INGA`
  --> src/lib.rs:5:5
   |
5  |     const INGA: T;
   |     ^^^^^^^^^^^^^^

1 Ответ

0 голосов
/ 10 января 2019

Я получил это, добавив + consts<T> в реализацию CMPS и изменив let pr: T = consts::INGA; на let pr = T::INGA, что привело к следующему:

impl<T: Clone + ntraits::Float + ntraits::FromPrimitive + consts<T>> CMPS<T> {
    pub fn cerf(a: T, b: T) -> CMPS<T> {
        let pr = T::INGA;
        CMPS { a: rtr, b: rti }
    }
}
...