拡張 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]
チャレンジ
簡単項目とその価格を含むショッピングリストを処理し、データをさまざまな形式で表示するプログラムを作成してください。
プログラムの要件:
- 各項目の番号と価格を出力します(
enumerateを使用)。形式はItem N: $Priceです(例:Item 1: $2.75)。 - 価格をペアで出力し(
chunksを使用)、バンドル価格として表示します。バンドルに2つの項目がある場合は、合計を出力します:Bundle N: $Price1 + $Price2 = $Sum。1つの項目しかない場合は、次の形式で出力します:Bundle N: $Price。 - すべての価格に10%の割引を適用します(
iter_mutを使用)。 - 割引後の最終価格を、それぞれ新しい行に出力し、小数点以下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桁にフォーマットして表示する
// 期待される出力形式は指示に示されている
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ