2016-05-22 4 views
9

構造体のToString特性を正しく実装する方法は?私は、コードを持っていると仮定し

struct A { 
    names: Vec<String>, 
} 

impl ToString for A { 
    fn to_string(&self) -> String { 
     // code here 
    } 
} 

fn main() { 
    let a = A { names: vec![ 
     "Victor".to_string(), 
     "Paul".to_string(), 
    ]}; 
    println!("A struct contains: [{}].", a.to_string()); 
} 

予想される出力:

構造体が含まれています:[ビクター、ポール]。

Rustを最大限に使用して目標を達成するために、この特性を実装する最良の方法は何ですか?

I「は、各々のための」いくつかの奇妙なを試してみましたが、他のものが、それぞれが私にこのような末尾のカンマ与えている:もちろん

ビクター、ポール、

を私は後でそれをポップが、私ことができます言語に興味があるので、私はこのベストプラクティスを知りたいです。これは私が試したことの一例ですが、それは問題ではありません。Rust言語の意味においてこれを最も効率的に、より良くする方法を尋ねています。

P.S.私はまだRustを学んでいます。 documentationToStringによれば

答えて

13

この特性は自動的Display形質を実装する任意のタイプのために実装されています。そのため、ToStringを直接実装しないでください。代わりにDisplayを実装し、無料でToStringの実装を取得してください。

fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 
    let mut str = ""; 
    for name in &self.names { 
     try!(fmt.write_str(str)); 
     try!(fmt.write_str(name)); 
     str = ", "; 
    } 
    Ok(()) 
} 

そして、あなたはto_stringを呼び出す必要はありません(ただし、することができます):

fn main() { 
    let a = A { names: vec![ 
     "Victor".to_string(), 
     "Paul".to_string(), 
    ]}; 
    println!("A struct contains: [{}].", a); 
} 

Displayの目的に注意してください。

あなたはこのような Displayを実装することができ

Displayは似ていますDebugになりますが、Displayはユーザ向けの出力用であり、したがって導出できません。

あなたの目的は、デバッグの場合は、Debug導き出すことができます。

#[derive(Debug)] 
struct A { 
    names: Vec<String>, 
} 

fn main() { 
    let a = A { names: vec![ 
     "Victor".to_string(), 
     "Paul".to_string(), 
    ]}; 
    // {:?} is used for debug 
    println!("{:?}", a); 
} 

出力:

A { names: ["Victor", "Paul"] } 

Formatter構造体は、メソッドの豊富なコレクションを提供していますので、あなたはDebug自分自身を書くことができます実装:

impl fmt::Debug for A { 
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 
     fmt.debug_struct("A") 
      .field("names", &self.names) 
      .finish() 
    } 
} 
+0

すべて素晴らしいですが、 'fmt.write_str()'戻り値を気にする必要がありますか?コンパイラは、結果を使用する必要があり、警告を出すことを訴える。 –

+0

あなたは正しいです。呼び出しは['try!'](https:// doc)でラップする必要があります。rust-lang.org/stable/std/macro.try.html)マクロ。私は答えを更新しました。ありがとう。 – malbarbo

+0

http://stackoverflow.com/q/22243527/155423の複製としてクローズするとどう思いますか? – Shepmaster

関連する問題