struct - RUST:更好(更简单/更简单)的方式来使用结构中的枚举?
问题描述
也许这是一个有点奇怪的问题,但是有没有更好(更简单/更漂亮)的方式来使用“来自结构的枚举”?没有“选项”?请。
下面是一些简单的代码变体:“Struct only”、“Enum only”和该死的“Enum from Struct”......如果可以在呈现的代码上使用“Your advice”,那么获取提示可能会容易得多。
fn main() {
// ---- STRUCT only:
#[derive(Debug)]
struct Ipv4Addr {
v4: (u8, u8, u8, u8),
}
#[derive(Debug)]
struct Ipv6Addr {
v6: String,
}
let home = Ipv4Addr { v4: (127, 0, 0, 1) };
let loopback = Ipv6Addr {
v6: String::from("::1"),
};
println!("\n\tStruct:\n");
println!("home: {:?} , loopback: {:?}", home, loopback);
// ---- ENUM 1 - only enum:
#[derive(Debug)]
enum IpAddr2 {
V4(u8, u8, u8, u8),
V6(String),
}
let home1 = IpAddr2::V4(127, 0, 0, 1);
let loopback1 = IpAddr2::V6(String::from("::1"));
println!("\n\tEnum1:\n");
println!("home1: {:?}, loopback1: {:?}\n", home1, loopback1);
// ---- ENUM 2 - from Struct:
#[derive(Debug)]
enum IpAddr {
V4(Ipv4Addr),
V6(Ipv6Addr),
}
let home2 = IpAddr::V4(Ipv4Addr { v4: (127, 0, 0, 1) }); // <-- *a little "meh"?
let loopback2 = IpAddr::V6(Ipv6Addr {
v6: ("::1").to_string(), // <-- *?
});
println!("\n\tEnum2:\n");
println!("home2: {:?}, loopback2: {:?}\n", home2, loopback2);}
解决方案
为什么不能为此使用元组结构?就像是
struct Ipv4(u8,u8,u8,u8);
struct Ipv6(String); // isn't ipv6 8*u16?
enum IpAddr {
V4(Ipv4),
V6(Ipv6),
}
fn main() {
let ip4 = IpAddr::V4(Ipv4(192,168,0,1));
let ip6 = IpAddr::V6(Ipv6("::1".into()));
}
推荐阅读
- java - 我的代码中出现 NumberFormatException 错误。我确保每个文件都不为空
- android - 你如何修复滑翔错误?
- python - 如何输入提到的频道并在该频道中发送消息?
- python - 如何制作一个简单的机器人来发送我发送的状态更新。(discord.py)
- mongodb - 将 mongodb 从 4.2 升级到 4.4 失败,出现“...不支持的 WiredTiger 文件版本...”
- android - 在外部存储中创建文件的问题
- c# - 将文件上传到 S3 存储桶:await fileTransferUtility.UploadAsync(filePath, _bucket) 出现空引用异常
- javascript - 没有在材质对话框组件上调用角度材质主题
- .net - VB.NET 继承 IntelliSense 幻象成员
- c# - 在 Func 中通过 Lembda 传递子类型