Generics 如何转换Rust中数字的泛型?

Generics 如何转换Rust中数字的泛型?,generics,rust,Generics,Rust,我有以下代码: 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 chann

我有以下代码:

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,
    };
}
pub fn在索引(&self,x:u32,y:u32,z:u32,t:u32)->f64处以双精度获取值{
使用ChannelDataType::*;
让channel_data=&self.channel_data[t as usize];
设指数=1;
//恐慌;
返回匹配通道\数据。数据\类型{
BYTE=>通道_数据。获取_数据::()[index]为f64,
SHORT=>channel_data.get_data::()[index]为f64,
INT=>channel_data.get_data::()[index]为f64,
FLOAT=>通道_数据。获取_数据::()[index]为f64,
_ => -1.0,
};
}
我想把它转换成通用的。我发现并试图复制它,但我得到了一个编译错误

下面是我的最小重复性示例():

extern板条箱数量;//0.2.1
使用num::cast::AsPrimitive;
使用num::num;
fn获取数据()->[T;1]{
[T::zero()]
}
fn在索引处获取值(输出类型:u8,索引:usize)->T
哪里
T:num::cast::AsPrimitive+num+Sized,
{
匹配输出类型{
0=>获取_数据::()[0]。作为_(),
1=>获取_数据::()[0]。作为_(),
_=>恐慌!(“未在操场处理”),
}
}
我发现以下错误:

error[E0277]:不满足特性绑定`u8:num::traits::AsPrimitive`
-->src/lib.rs:14:34
|
14 | 0=>get_data::()[0].as_u(),
|^^^未为`u8实现trait`num::traits::AsPrimitive``
错误[E0277]:未满足特性绑定'u16:num::traits::AsPrimitive'
-->src/lib.rs:15:35
|
15 | 1=>get_data::()[0].as_u(),
|^u16未实现trait`num::traits::AsPrimitive``

我做错了什么?

你的问题可以用;;的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。是否要
u8:AsPrimitive+Num+Sized
?@shepmaster抱歉,我已提前点击了“保存编辑”,未意识到您将被拒绝。我最初的代码应该是我想要做的,但是最初的游乐场代码产生了错误,现在我已经让游乐场产生了错误,并且具有了我试图实现的精神。
特性绑定`u8:num::traits::AsPrimitive`未得到满足
-您需要这些边界@Shepmaster你能把答案贴出来吗?我不知道您必须手动将其添加到类型要求中。我假设通过使用“use num::cast::AsPrimitive”,编译器会自动实现它,但我错了。我以前从未遇到过这种语法,并假设您的意思是用u8替换T,而不是说我需要两者。谢谢你!你的问题可以用;;的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。是否要
u8:AsPrimitive+Num+Sized
?@shepmaster抱歉,我已提前点击了“保存编辑”,未意识到您将被拒绝。我最初的代码应该是我想要做的,但是最初的游乐场代码产生了错误,现在我已经让游乐场产生了错误,并且具有了我试图实现的精神。
特性绑定`u8:num::traits::AsPrimitive`未得到满足
-您需要这些边界@Shepmaster你能把答案贴出来吗?我不知道您必须手动将其添加到类型要求中。我假设通过使用“use num::cast::AsPrimitive”,编译器会自动实现它,但我错了。我以前从未遇到过这种语法,并假设您的意思是用u8替换T,而不是说我需要两者。谢谢你!
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"),
    }
}