我正在玩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)
。
答案 0 :(得分:3)
您的朋友是标准库中的FromStr
特征。它抽象了可以从字符串创建的类型。您可以看到Ipv4Addr
,Ipv6Addr
和IpAddr
都实现了这一特性!所以你可以写:
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
以表示该字符串是否有效。