はじめに
この実験では、Rust の Vec を含む List と呼ばれる構造体に対して fmt::Display を実装します。課題は、write! マクロを使用して各要素を順次処理することです。これは fmt::Result を生成するため、適切に処理する必要があります。これに対処するために、write! がエラーを返すかどうかを確認し、返した場合はそれを返し、そうでなければ実行を続けるために ? 演算子を使用できます。List に対して fmt::Display を実装することで、ベクトル内の要素を反復処理し、角括弧内にコンマ区切りで表示することができます。課題は、プログラムを修正して、ベクトル内の各要素のインデックスも表示することです。修正後の期待される出力は [0: 1, 1: 2, 2: 3] です。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、
main.rsを使用して、rustc main.rs &&./mainでコンパイルして実行できます。
テストケース:List
要素を順次処理する必要がある構造体に対して fmt::Display を実装することは難しいです。問題は、各 write! が fmt::Result を生成することです。これを適切に処理するには、すべての 結果を処理する必要があります。Rust はまさにこの目的のために ? 演算子を提供しています。
write! に ? を使用すると、次のようになります。
// `write!` を試してエラーが発生するかどうかを確認します。エラーが発生した場合は、
// エラーを返します。そうでなければ処理を続行します。
write!(f, "{}", value)?;
? が利用できるので、Vec に対して fmt::Display を実装するのは簡単です。
use std::fmt; // `fmt` モジュールをインポートします。
// `Vec` を含む `List` という名前の構造体を定義します。
struct List(Vec<i32>);
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// タプルインデックスを使用して値を抽出し、
// `vec` への参照を作成します。
let vec = &self.0;
write!(f, "[")?;
// `vec` 内の `v` を反復処理しながら、反復処理の
// カウントを `count` に列挙します。
for (count, v) in vec.iter().enumerate() {
// 最初の要素以外のすべての要素には、コンマを追加します。
// エラーが発生した場合は `?` 演算子を使用して返します。
if count!= 0 { write!(f, ", ")?; }
write!(f, "{}", v)?;
}
// 開いた角括弧を閉じて、`fmt::Result` 値を返します。
write!(f, "]")
}
}
fn main() {
let v = List(vec![1, 2, 3]);
println!("{}", v);
}
アクティビティ
ベクトル内の各要素のインデックスも表示するようにプログラムを変更してみてください。新しい出力は次のようになるはずです。
[0: 1, 1: 2, 2: 3]
まとめ
おめでとうございます!あなたはテストケース:List の実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を練習できます。