C中的枚举定义如下:
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并调整枚举值的大小?因为我发现铁锈似乎无法做出比判断更大或更平等的判断。
发布于 2022-07-26 12:18:26
为了实现这一点,您需要使用:
values
PartialEq PartialOrd性状标签值
锈菌枚举可以具有标记值,如:
enum Virtualization {
VirtualizationNone = 0,
VirtualizationVMFirst = 1,
VirtualizationAmazon = 2,
VirtualizationQEMU = 3,
...
VirtualizationInvalid = -22
}实现常量
VIRTUALIZATION_KVM = VIRTUALIZATION_VM_FIRST这样的变体会出现问题,就像锈蚀一样,两个枚举变体不能具有相同的标记值。
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常量:
#[allow(non_upper_case_globals)]
impl Virtualization {
pub const VirtualizationKVM: Self = Self::VirtualizationVMFirst;
pub const VirtualizationVMLast: Self = Self::VirtualizationVMOther;
...
}比较性状
最后,为了比较标记的锈蚀常数,可以导出PartialEq和PartialOrd的实现。
#[derive(PartialEq, PartialOrd)]
enum Virtualization {
...
}现在,您可以比较所有枚举变体和实现常量。例如:
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 falsehttps://stackoverflow.com/questions/73122773
复制相似问题