Как мне конвертировать generic c для чисел в Rust? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть следующий код:

pub fn get_value_as_double_at_index(&self, x: u32, y: u32, z: u32, t: u32) -> f64 {
    use ChannelDataType::*;
    let channel_data = &self.channel_data[t as usize];
    let index = 1;
    // panic!("oops");
    return match channel_data.data_type {
        BYTE => channel_data.get_data::<u8>()[index] as f64,
        SHORT => channel_data.get_data::<u16>()[index] as f64,
        INT => channel_data.get_data::<u32>()[index] as f64,
        FLOAT => channel_data.get_data::<f64>()[index] as f64,
        _ => -1.0,
    };
}

Я хочу преобразовать его в общий c. Я нашел Как преобразовать универсальные c примитивные типы в Rust? и попытался воспроизвести его, но я получил ошибку компиляции.

Вот мой минимально воспроизводимый пример ( детская площадка ):

extern crate num; // 0.2.1
use num::cast::AsPrimitive;
use num::Num;

fn get_data<T: num::Zero + Num + Sized>() -> [T; 1] {
    [T::zero()]
}

fn get_value_at_index<T>(output_type: u8, index: usize) -> T
where
    T: num::cast::AsPrimitive<T> + Num + Sized,
{
    match output_type {
        0 => get_data::<u8>()[0].as_(),
        1 => get_data::<u16>()[0].as_(),
        _ => panic!("not handled in playground"),
    }
}

Я получаю следующие ошибки:

error[E0277]: the trait bound `u8: num::traits::AsPrimitive<T>` is not satisfied
  --> src/lib.rs:14:34
   |
14 |         0 => get_data::<u8>()[0].as_(),
   |                                  ^^^ the trait `num::traits::AsPrimitive<T>` is not implemented for `u8`

error[E0277]: the trait bound `u16: num::traits::AsPrimitive<T>` is not satisfied
  --> src/lib.rs:15:35
   |
15 |         1 => get_data::<u16>()[0].as_(),
   |                                   ^^^ the trait `num::traits::AsPrimitive<T>` is not implemented for `u16`

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...