根据rust函数的泛型选择常量



是否有办法根据泛型类型选择常数的值?

例如(无效Rust代码):

fn foo<T>() {
let b = match T {
u32 => 0x01234567u32,
u64 => 0x0123456789abcdefu64,
_ => panic!()
}
}
fn main() {
foo::<u32>();
foo::<u64>();
}

此函数仅设计用于u16,u32u64类型。

你可以使用一个trait的关联常数:

trait MyTrait {
const SOME_CONST: Self;
}
impl MyTrait for u32 {
const SOME_CONST: Self = 0x01234567u32;
}
impl MyTrait for u64 {
const SOME_CONST: Self = 0x0123456789abcdefu64;
}
fn foo<T>() where T: MyTrait {
let _b: T = T::SOME_CONST;
}
fn main() {
foo::<u32>();
foo::<u64>();
}

在生锈的操场上试试。

如果您需要做的不仅仅是返回一个值,您还可以匹配泛型的TypeId,但是您必须将返回值包装在enum中,因为您不能从单个match语句返回多个类型:

use std::any::TypeId;
#[derive(Debug)]
enum Value {
u32(u32),
u64(u64),
}
fn foo<T: 'static>() -> Value {
match TypeId::of::<T>() {
t if t == TypeId::of::<u32>() => {
// other stuff
Value::u32(0x01234567u32)
},
t if t == TypeId::of::<u64>() => {
// other stuff
Value::u64(0x0123456789abcdefu64)
},
_ => panic!(),
}
}
fn main() {
println!("{:?}", foo::<u32>());
println!("{:?}", foo::<u64>());
}

如果获取一个常量值是你唯一需要的功能,那么前面提到的相关常量会更好。

最新更新