Menu
Coddy logo textTech

拡張 for ループ

CoddyのRustジャーニー「基礎」セクションの一部。レッスン 66/75。

配列を反復処理する方法はいくつかあります。ここではその一部を紹介します:
次の配列を考えてみましょう:

let numbers = [1, 2, 3, 4, 5];
  • 直接イテレーター:

    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)
  • 特定のサイズのスライス:

    for chunk in numbers.chunks(2) { }
    // 値: [1,2], [3,4], [5]

    chunkスライスなので、スライスのメソッドを使用できます。たとえば、chunk.len() はその chunk に含まれる要素の数を返します。array を均等に分割できない場合、最後の chunk はより小さくなることがあります。

.chunks().enumerate()をチェーンして、インデックスとチャンクの両方を同時に取得することもできます:

for (i, chunk) in numbers.chunks(2).enumerate() { }
// 値: (0,[1,2]), (1,[3,4]), (2,[5])

ここでは、まず.chunks(2)がスライスを生成し、次に.enumerate()がそれぞれをカウンターでラップするため、iはチャンクのインデックス、chunkはスライスになります。

  • 変更を伴う反復処理:

    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. 価格をペアで出力し(chunks を使用)、バンドル価格として表示します。バンドルに2つの項目がある場合は、合計を出力します:Bundle N: $Price1 + $Price2 = $Sum。1つの項目しかない場合は、次の形式で出力します:Bundle N: $Price
  3. すべての価格に10%の割引を適用します(iter_mut を使用)。
  4. 割引後の最終価格を、それぞれ新しい行に出力し、小数点以下2桁まで表示します(例:$2.48)。

Hint: イテレーターは連結できます。たとえば、prices.chunks(2).enumerate() を使うと、チャンクの index とチャンクのスライスの両方を一度に取得できます。各 chunk はスライスなので、chunk.len() を呼び出したり、chunk[0]chunk[1] などで index を指定したりできます。

価格の Expected output Format:
${:.2} を使って価格を小数点以下2桁まで表示します。

exact なテキストは Bundle 4: $7.90 です。

自分で試してみよう

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桁にフォーマットする。正確な形式は指示を参照


    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 の場合、指示に記載されている単一アイテムの行を表示する
    // {:.2} を使ってすべての価格を小数点以下2桁にフォーマットする


    // TODO: Use iter_mut() to apply a 10% discount to all prices
    // Hint: 各 *price に 0.9 を掛ける


    println!("\nPrices after 10% discount:");
    // TODO: 割引後の各価格を小数点以下2桁にフォーマットして表示する
    // 期待される出力形式は指示に示されている

}
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Rustオンラインコンパイラ