2017-02-03 59 views
1

我在玩Iron,我遇到了這個問題。如何在不知道特定IP版本的情況下創建`IpAddr`?

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)

回答

2

你的朋友是來自標準庫的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信號串是否是有效。

+0

爲什麼這兩種方式?第二種更習慣嗎? – Boiethios

+1

@Boiethios'parse()'在內部使用'from_str()'。它只是爲了方便而存在的:你不必輸入特徵,而且你通常不必提及類型名稱,因爲類型推斷會爲你做(可能在你的情況下)。我*認爲*'parse()'更「慣用」,就像「更頻繁使用」一樣。 –

+0

感謝您的回答。 – Boiethios

相關問題