[英]How can an IpAddr be converted to an IPv4Addr?
在 Rust 中,很容易從IpV4Addr
創建IpAddr
:
let ipv4 = IpV4Addr::new(127,0,0,1);
let ip = IpAddr::V4(ipv4);
但似乎沒有回頭路了:
if ip.is_ipv4() {
let ipv4: IpV4Addr = .....?
}
原因是我需要在某個時候訪問 IPv4 地址的八位字節(通過IPv4::octets
)以通過網絡傳輸它們。 但是,我想在應用程序的其他部分使用更通用的IpAddr
表示,因為我想在將來實現 IPv6,因此使網絡代碼不是 IPv4 特定的。
IpAddr
是 IP 地址的抽象。 它是一個枚舉,它包含Ipv4Addr
或Ipv6Addr
以及一些提供對它們的抽象訪問的方法。
Rust 不會讓您將IpAddr
轉換為Ipv4Addr
因為如果它實際上是Ipv6Addr
怎么辦? 你也必須處理這種情況。 你讓 Rust 相信你已經用match
處理了所有的可能性。
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
fn main() {
let ips = [
IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)),
IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)),
];
for ip in ips.iter() {
match *ip {
IpAddr::V4(ip4) => println!("ipv4: {}, octets: {:?}", ip4, ip4.octets()),
IpAddr::V6(ip6) => println!("ipv6: {}, segments: {:?}", ip6, ip6.segments()),
}
}
}
不需要默認情況,因為 Rust 類型檢查器知道沒有其他可能性。 ips
是一個IpAddr
數組,僅包含兩種可能性,V4 或 V6。 事實上,如果你放了一個,Rust 會發出警告,所以如果IpAddr
將來發生變化,你會意識到編譯錯誤。
IpAddr
是一個枚舉,因此您可以使用模式匹配:
if let IpAddr::V4(ipv4) = ip {
// here ipv4 is of type IpV4Addr
}
// or, if you need to handle IPv6 as well
match ip {
IpAddr::V4(ipv4) => { /* handle IPv4 */ }
IpAddr::V6(ipv6) => { /* handle IPv6 */ }
}
此外, IpAddr
是Copy
,因此您甚至無需擔心消耗其原始值( ip
變量),它只會為您隱式復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.