如何在不知道具体IP版本的情况下创建`IpAddr`?

时间:2017-02-03 18:02:36

标签: rust

我正在玩Iron,我遇到了这个问题。

fn main() {
    let mut router = Router::new();
    let address = "127.0.0.1"; // or maybe "::1/128"
    let port = 3000;
    let ip = std::net::IpAddr::new(address); // does not exist

    Iron::new(router).http((ip, port)).unwrap();
}

http()方法采用实现ToSocketAddrs的结构。 (&str, u16)实现了此特性,但我更愿意在调用http()方法之前验证用户输入的有效性。

我看到(std::net::IpAddr, u16)实现了这个特性,但我不知道如何建立一个IpAddr“agnostically”:也许用户写了一个IPv4地址,也许是IPv6。

有没有办法只从字符串创建IpAddr?我认为这是可能的,因为我可以给它一个(&str, u16)

1 个答案:

答案 0 :(得分:3)

您的朋友是标准库中的FromStr特征。它抽象了可以从字符串创建的类型。您可以看到Ipv4AddrIpv6AddrIpAddr都实现了这一特性!所以你可以写:

use std::str::FromStr;

let addr = IpAddr::from_str("127.0.0.1");

或者,稍微更常见的方式,使用str::parse()方法:

let addr = "127.0.0.1".parse::<IpAddr>();

from_str() / parse()方法返回Result以表示该字符串是否有效。