拡張 for ループ
CoddyのRustジャーニー「Fundamentals」セクションの一部 — レッスン 66/75。
配列を反復処理する方法はいくつかあります。以下はその一部です:
次の配列を考えてみましょう:
let numbers = [1, 2, 3, 4, 5];直接イテレータ (Direct Iterator):
for num in numbers.iter() {} // 値: 1, 2, 3, 4, 5
インデックスと値:
for (index, value) in numbers.iter().enumerate() { } // 値: (0,1), (1,2), (2,3), (3,4), (4,5)
特定のサイズの Slice:
for chunk in numbers.chunks(2) { } // 値: [1,2], [3,4], [5]各 chunk は slice なので、その上で slice メソッドを使用できます。たとえば、
chunk.len()はその chunk に含まれる要素の数を返します。配列の要素数が均等に割り切れない場合、最後の chunk は小さくなることがあります。
.chunks() に .enumerate() をチェーン接続して、インデックスと chunk の両方を同時に取得することもできます:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// 値: (0,[1,2]), (1,[3,4]), (2,[5])ここでは、まず .chunks(2) が slice を生成し、次に .enumerate() が each をカウンターでラップします — したがって i は chunk の index であり、chunk は slice になります。
変更を伴うイテレーション:
for num in numbers.iter_mut() { *num *= 2; } // 配列は次のようになります: [2, 4, 6, 8, 10]
チャレンジ
簡単商品とその価格を含むショッピングリストを処理し、データのさまざまなビューを提供するプログラムを作成してください。
プログラムは以下の処理を行う必要があります:
- 各アイテムの番号と価格を出力します(
enumerateを使用)。Item N: $Priceの形式でフォーマットします(例:Item 1: $2.75)。 - 「セット販売 (bundle deals)」として、価格をペアで出力します(
chunksを使用)。セットに2つのアイテムがある場合は、合計を出力します:Bundle N: $Price1 + $Price2 = $Sum。1つのアイテムしかない場合は、Bundle N: $Priceと出力します。 - すべての価格に10%の割引を適用します(
iter_mutを使用)。 - 最終的な割引後の価格をそれぞれ改行して、小数第2位までフォーマットして出力します(例:
$2.48)。
ヒント: イテレータをチェーンさせることができます — 例えば、prices.chunks(2).enumerate() を使用すると、chunk の index と chunk の slice の両方を一度に取得できます。各 chunk は slice なので、chunk.len() を呼び出したり、chunk[0] や chunk[1] などでインデックス参照したりできます。
価格の期待される出力フォーマット:
価格を小数第2位までフォーマットするには ${:.2} を使用します。
自分で試してみよう
fn main() {
let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];
println!("Original Prices:");
// TODO: enumerate() を使って各アイテム番号と価格を表示する
// Hint: prices.iter().enumerate() は (index, &price) のペアを返す
// {:.2} を使って価格を小数点以下2桁にフォーマットする — 例: "Item 1: $2.75"
println!("\nBundle Deals:");
// TODO: chunks(2) と enumerate() をチェーンする: prices.chunks(2).enumerate()
// これは (index, chunk) のペアを返す — 各 chunk はスライスなので、chunk.len() でそのサイズがわかる
// If chunk.len() == 2, print: "Bundle 1: $2.75 + $1.50 = $4.25"
// chunk.len() == 1 の場合、次のように表示: "Bundle 4: $7.90"
// {:.2} を使ってすべての価格を小数点以下2桁にフォーマットする
// TODO: iter_mut() を使ってすべての価格に10%の割引を適用する
// Hint: 各 *price に 0.9 を掛ける
println!("\nPrices after 10% discount:");
// TODO: 割引後の各価格を小数点以下2桁にフォーマットして表示する
// 期待値: "$2.48" など
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。