2017-02-03 2 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形質です。文字列から作成できる型を抽象化します。 Ipv4Addrが表示されているように、Ipv6AddrIpAddrはすべてその特性を実装しています!だから、書き込みのいずれかの可能性:

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

なぜこれらの2つの方法がありますか? 2番目はもっと慣用的ですか? – Boiethios

+1

@Boiethios 'parse()'は 'from_str()'を内部的に使います。便宜上存在するのは、その特性をインポートする必要はなく、タイプ推論はあなたのために(おそらくあなたの場合も同様に)それを行うため、タイプ名を言及する必要はありません。 * 'parse()'は「より頻繁に使用される」のようにもっと慣用的です。 –

+0

あなたの答えをありがとう。 – Boiethios

関連する問題