首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据锈蚀函数中的泛型类型选择常量

根据锈蚀函数中的泛型类型选择常量
EN

Stack Overflow用户
提问于 2022-06-23 13:39:10
回答 2查看 54关注 0票数 3

是否可以根据泛型类型选择常量的值?

例如,类似于(无效的锈蚀代码):

代码语言:javascript
复制
fn foo<T>() {
    let b = match T {
        u32 => 0x01234567u32,
        u64 => 0x0123456789abcdefu64,
        _ => panic!()
    }
}

fn main() {
    foo::<u32>();
    foo::<u64>();
}

此函数仅用于u16u32u64类型的操作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-23 13:48:24

您可以使用一个特征的伴生常数

代码语言:javascript
复制
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>();
}

生锈操场上试一试。

票数 6
EN

Stack Overflow用户

发布于 2022-06-23 14:05:12

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

代码语言:javascript
复制
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>());
}

但是,如果获得常量值是您需要的唯一功能,那么前面提到的关联常量会更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72731166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档