首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将C Enum转换为Rust Enum并确定大小

如何将C Enum转换为Rust Enum并确定大小
EN

Stack Overflow用户
提问于 2022-07-26 11:44:13
回答 1查看 107关注 0票数 0

C中的枚举定义如下:

代码语言:javascript
复制
    enum {
        VIRTUALIZATION_NONE = 0,

        VIRTUALIZATION_VM_FIRST,
        VIRTUALIZATION_KVM = VIRTUALIZATION_VM_FIRST,
        VIRTUALIZATION_AMAZON,
        VIRTUALIZATION_QEMU,
        VIRTUALIZATION_BOCHS,
        VIRTUALIZATION_XEN,
        VIRTUALIZATION_UML,
        VIRTUALIZATION_VMWARE,
        VIRTUALIZATION_ORACLE,
        VIRTUALIZATION_MICROSOFT,
        VIRTUALIZATION_ZVM,
        VIRTUALIZATION_PARALLELS,
        VIRTUALIZATION_BHYVE,
        VIRTUALIZATION_QNX,
        VIRTUALIZATION_ACRN,
        VIRTUALIZATION_POWERVM,
        VIRTUALIZATION_VM_OTHER,
        VIRTUALIZATION_VM_LAST = VIRTUALIZATION_VM_OTHER,

        VIRTUALIZATION_CONTAINER_FIRST,
        VIRTUALIZATION_SYSTEMD_NSPAWN = VIRTUALIZATION_CONTAINER_FIRST,
        VIRTUALIZATION_LXC_LIBVIRT,
        VIRTUALIZATION_LXC,
        VIRTUALIZATION_OPENVZ,
        VIRTUALIZATION_DOCKER,
        VIRTUALIZATION_PODMAN,
        VIRTUALIZATION_RKT,
        VIRTUALIZATION_WSL,
        VIRTUALIZATION_PROOT,
        VIRTUALIZATION_POUCH,
        VIRTUALIZATION_CONTAINER_OTHER,
        VIRTUALIZATION_CONTAINER_LAST = VIRTUALIZATION_CONTAINER_OTHER,

        _VIRTUALIZATION_MAX,
        _VIRTUALIZATION_INVALID = -EINVAL,
};

如何将其转换为Rust并调整枚举值的大小?因为我发现铁锈似乎无法做出比判断更大或更平等的判断。

EN

回答 1

Stack Overflow用户

发布于 2022-07-26 12:18:26

为了实现这一点,您需要使用:

values

  • Implement constants

  • PartialEq
  • 标记和PartialOrd性状

标签值

锈菌枚举可以具有标记值,如:

代码语言:javascript
复制
enum Virtualization {
        VirtualizationNone = 0,
        VirtualizationVMFirst = 1,
        VirtualizationAmazon = 2,
        VirtualizationQEMU = 3,
        ...
        VirtualizationInvalid = -22
}

实现常量

VIRTUALIZATION_KVM = VIRTUALIZATION_VM_FIRST这样的变体会出现问题,就像锈蚀一样,两个枚举变体不能具有相同的标记值。

代码语言:javascript
复制
error[E0081]: discriminant value `1` already exists
 --> src/main.rs:5:22
  |
4 |     VirtualizationVMFirst = 1,
  |                             - first use of `1`
5 |     VirtualizationKVM = 1,
  |                         ^ enum already has `1`

为了解决这个问题,可以对重复值使用impl常量:

代码语言:javascript
复制
#[allow(non_upper_case_globals)]
impl Virtualization {
    pub const VirtualizationKVM: Self = Self::VirtualizationVMFirst;
    pub const VirtualizationVMLast: Self = Self::VirtualizationVMOther;
    ...
}

比较性状

最后,为了比较标记的锈蚀常数,可以导出PartialEqPartialOrd的实现。

代码语言:javascript
复制
#[derive(PartialEq, PartialOrd)]
enum Virtualization {
    ...
}

现在,您可以比较所有枚举变体和实现常量。例如:

代码语言:javascript
复制
fn main() {
    println!("Virtualization::VirtualizationNone < Virtualization::VirtualizationVMFirst {}", (Virtualization::VirtualizationNone < Virtualization::VirtualizationVMFirst));
    println!("Virtualization::VirtualizationNone > Virtualization::VirtualizationVMFirst {}", (Virtualization::VirtualizationNone > Virtualization::VirtualizationVMFirst));
}

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

https://stackoverflow.com/questions/73122773

复制
相关文章

相似问题

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