首页 > 解决方案 > RUST:更好(更简单/更简单)的方式来使用结构中的枚举?

问题描述

也许这是一个有点奇怪的问题,但是有没有更好(更简单/更漂亮)的方式来使用“来自结构的枚举”?没有“选项”?请。

下面是一些简单的代码变体:“Struct only”、“Enum only”和该死的“Enum from Struct”......如果可以在呈现的代码上使用“Your advice”,那么获取提示可能会容易得多。

https://play.rust-lang.org/

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);}

标签: structrustenums

解决方案


为什么不能为此使用元组结构?就像是

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()));
}

推荐阅读