У меня есть следующий код:
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`
Что я делаю не так?