我对这句话出自“锈书”很困惑
使用枚举而不是结构还有另一个好处:每个变体可以有不同类型和数量的关联数据。Version 4类型的IP地址将始终有4个数值组件,其值介于0到255之间。如果我们想将V4地址存储为四个
u8值,但仍然将V6地址表示为一个String值,那么将无法使用结构。Enum轻松地处理此案件: # fn main() { enum IpAddr { V4(u8,u8),V6(String),} let home = IpAddr::V4(127,0,0,1);让循环返回=IpAddr::V6(字符串:from(“:1”));}
但是,当我尝试使用structs将V4地址存储为四个u8值时,仍然将V6地址表示为一个String值,它也没有任何错误。
#[derive(Debug)]
struct IpAddr {
V4:(u8, u8, u8, u8),
V6:String,
}
fn main () {
let home = IpAddr {
V4: (127, 1, 1, 1),
V6: String::from("Hello"),
};
println!("{:#?}", home);
}发布于 2019-07-01 05:39:24
这不一样。所有的枚举元素都有相同的大小!枚举元素的大小是最大变量的大小加上变量标识符的大小。
用结构来说有点不一样。如果忽略填充,则结构的大小是其成员大小的总和。有了填充物,就会有更多:
fn main() {
let size = std::mem::size_of::<TheEnum>();
println!("Enum: {}", size * 8);
let size = std::mem::size_of::<TheStruct>();
println!("Struct: {}", size * 8);
}
struct TheStruct {
a: u64,
b: u8,
c: u64
}
enum TheEnum {
A(u64),
B(u8),
C(u64)
}在这里,我们可以看到不同之处:
另一个不同之处在于使用枚举和结构的方式。在枚举中,您只需初始化其中一个变体。在你的情况下-- IPv4或IPv6。使用一个结构,如您的示例所示,您必须同时提供V4和v6地址。您不能只提供V4或V6。
https://stackoverflow.com/questions/56830274
复制相似问题