Menu
Coddy logo textTech

拡張 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]
challenge icon

チャレンジ

簡単

商品とその価格を含むショッピングリストを処理し、データのさまざまなビューを提供するプログラムを作成してください。

プログラムは以下の処理を行う必要があります:

  1. 各アイテムの番号と価格を出力します(enumerate を使用)。Item N: $Price の形式でフォーマットします(例: Item 1: $2.75)。
  2. 「セット販売 (bundle deals)」として、価格をペアで出力します(chunks を使用)。セットに2つのアイテムがある場合は、合計を出力します: Bundle N: $Price1 + $Price2 = $Sum。1つのアイテムしかない場合は、Bundle N: $Price と出力します。
  3. すべての価格に10%の割引を適用します(iter_mut を使用)。
  4. 最終的な割引後の価格をそれぞれ改行して、小数第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" など

}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Fundamentalsのすべてのレッスン