Rust by Example

1.2.2.1 テストケース: リスト

構造体のそれぞれの要素を別々に扱うfmt::Displayを実装するのはトリッキーです。というのも、それぞれのwrite!が別々のfmt::Resultを生成するためです。適切に処理するためにはすべてのresultに対して処理を書かなくてはなりません。このような場合はtry!マクロを使用するのが適当です。

以下のようにtry!write!に対して使用します。

// `write!`を実行し、エラーが生じた場合はerrorを返す。そうでなければ実行を継続する。
try!(write!(f, "{}", value));

try!を使用できれば、Vec用のfmt::Displayはより簡単に実装できます。

use std::fmt; // Import the `fmt` module. // `Vec`を含む`List`という名の構造体を定義 struct List(Vec<i32>); impl fmt::Display for List { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // `self`をデリファレンスし、 デストラクトすることで // `vec`へのリファレンスを作成する let List(ref vec) = *self; try!(write!(f, "[")); // `v`を介して`vec`をイテレーションし、同時にカウントを // `enumerate`で取得する for (count, v) in vec.iter().enumerate() { // 初回を除き、`write!`を呼ぶ前にカンマを加える。 // エラーを返すために`try!`を使用する if count != 0 { try!(write!(f, ", ")); } try!(write!(f, "{}", v)); } // 開きっぱなしのブラケットを閉じて、`fmt::Result`の値を返す。 write!(f, "]") } } fn main() { let v = List(vec![1, 2, 3]); println!("{}", v); }

See also

for, ref, Result, 構造体, try!, and vec!