Rust 如何基于泛型类型参数给出不同的值?

Rust 如何基于泛型类型参数给出不同的值?,rust,Rust,我试图通过以下方式实现一个VertexBufferLayoutstruct。我已经很容易地把C++系列改编成了锈,但我还是被卡住了。< /P> VertexBufferElement有一个计数,它使用的数据类型的glEnum和一个布尔值,标准化。有一种称为push的通用方法,它采用u32计数,将VertexBufferElement推送到elements Vec并更新步幅 我似乎无法让函数接受匹配类型的代码。当我遇到错误时,我尝试使用TypeId、Any和PhantomData pub fn p

我试图通过以下方式实现一个
VertexBufferLayout
struct。我已经很容易地把C++系列改编成了锈,但我还是被卡住了。< /P>
VertexBufferElement
有一个计数,它使用的
数据类型的glEnum和一个布尔值,标准化。有一种称为
push
的通用方法,它采用u32计数,将VertexBufferElement推送到elements Vec并更新步幅

我似乎无法让函数接受匹配类型的代码。当我遇到错误时,我尝试使用
TypeId
Any
PhantomData

pub fn push<T: 'a>(&mut self, count: u32) {
    let dt = TypeId::of::<T>();
    let (data_type, normalized) = if dt == TypeId::of::<i8>() {
        (gl::BYTE, false)
    } else if dt == TypeId::of::<u8>() {
        (gl::UNSIGNED_BYTE, true)
    } else if dt == TypeId::of::<i16>() {
        (gl::SHORT, false)
    } else if dt == TypeId::of::<u16>() {
        (gl::UNSIGNED_SHORT, false)
    } else if dt == TypeId::of::<i32>() {
        (gl::INT, false)
    } else if dt == TypeId::of::<u32>() {
        (gl::UNSIGNED_INT, false)
    } else if dt == TypeId::of::<f16>() {
        (gl::HALF_FLOAT, false)
    } else if dt == TypeId::of::<f32>() {
        (gl::FLOAT, false)
    } else if dt == TypeId::of::<f64>() {
        (gl::DOUBLE, false)
    } else {
        panic!("Incompatible Type")
    };
    self.elements.push(VertexBufferElement{data_type, count, normalized, _marker: PhantomData});
    self.stride += mem::size_of::<T>();
}
pub-fn推送(&mut-self,计数:u32){
帮助——考虑添加一个显式的生命周期约束T:“static”…
26 |设dt=TypeId::of::();
|                  ^^^^^^^^^^^^^^^
|
注意:…以便类型'T'满足其所需的生存期限制
-->opengl\examples\vertex\u buffer\u布局。rs:26:18
|
26 |设dt=TypeId::of::();
|  

起初它是'T'可能活得不够长,但它只是一个泛型函数,浮点只指示保存的数字,而不是类型本身,所以我尝试了
PhantomData
。此后出现的任何错误都是我不知道自己在做什么,以前从未使用过
PhantomData
,并且找不到任何关于此位置的信息编辑。

按照编译器的建议做对我来说很好:

帮助:考虑添加显式生命绑定<代码> T:“static …< /P>”


我甚至不希望出现运行时故障,但是:

enum Type {
    Byte,
    Short,
}

trait AsType {
    fn as_type() -> (Type, bool);
}

impl AsType for u8 {
    fn as_type() -> (Type, bool) {
        (Type::Byte, false)
    }
}

impl AsType for u16 {
    fn as_type() -> (Type, bool) {
        (Type::Short, true)
    }
}

fn main() {
    u8::as_type();   // Ok
    bool::as_type(); // Error
}
error[E0599]:在当前作用域中找不到类型'bool'的名为'as_type'的函数或关联项
-->src/main.rs:24:5
|
24 | bool::as_type();
|^^^^^^^^^^^^^^^^在`bool'中找不到函数或关联项`
|
=帮助:只有在trait已实现且在范围内时,才能使用trait中的项
=注意:以下特征将项定义为“类型”,可能您需要实现它:
候选人#1:`AsType`
#![feature(const_type_id)]

fn decide<T: 'static>() -> (Type, bool) {
    const ID_U8: TypeId = TypeId::of::<u8>();
    const ID_U16: TypeId = TypeId::of::<u16>();

    match TypeId::of::<T>() {
        ID_U8 => (Type::Byte, false),
        ID_U16 => (Type::Short, true),
        _ => panic!("Unknown type"),
    }
}
enum Type {
    Byte,
    Short,
}

trait AsType {
    fn as_type() -> (Type, bool);
}

impl AsType for u8 {
    fn as_type() -> (Type, bool) {
        (Type::Byte, false)
    }
}

impl AsType for u16 {
    fn as_type() -> (Type, bool) {
        (Type::Short, true)
    }
}

fn main() {
    u8::as_type();   // Ok
    bool::as_type(); // Error
}