【发布时间】:2022-11-01 22:19:54
【问题描述】:
我正在学习 Rust。我在 JavaScript 和 Python 方面有一些编程经验,并且曾经在 Haskell 上过得很好。
我正在学习枚举,但发现很难使用它们。这就是我正在做的事情:
fn main(){
enum IpAddr {
V4(u8, u8, u8, u8),
V6(u16, u16, u16, u16, u16, u16, u16, u16),
}
impl IpAddr {
fn last_octet (&self) -> &u16 {
match &self {
IpAddr::V4(_, _, _, d) => d as &u16,
IpAddr::V6(_, _, _, _, _, _, _, h) => h,
}
}
}
let localhost4 = IpAddr::V4(127, 0, 0, 1);
let localhost6 = IpAddr::V6(0, 0, 0, 0, 0, 0, 0, 1);
println!("{}", localhost4.last_octet());
println!("{}", localhost6.last_octet());
}
所以,我想分别对 IPv4 和 IPv6 使用 u8 和 u16 来利用类型系统。
我意识到我的 last_octet 方法只能返回一种有点限制的类型,所以显而易见的方法似乎将我的 IPv4 八位字节转换为 u16,但我无法找到一种方法来做到这一点。
关于我所做的任何建议或改进?
我在上面尝试了我的主要功能,但从 u8 到 u16 的转换失败了。
如果我尝试同样的简单
let u8: u8 = 7;
let u16: u16 = u8 as u16;
没有问题。所以,我不了解枚举或它们的方法。
【问题讨论】: