拡張 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
Index & Value:
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内に含まれる要素の数を返します。配列の要素数が均等に割り切れない場合、最後のchunkは他より小さくなる可能性があります。
インデックスとチャンクを同時に取得するために、.chunks() に .enumerate() をチェーン(Chain)接続することもできます:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// 値: (0,[1,2]), (1,[3,4]), (2,[5])ここでは、.chunks(2) が最初にスライスを生成し、次に .enumerate() が各要素をカウンターでラップします。したがって、i はチャンクのインデックス(index)であり、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)。
ヒント: イテレータをチェーンさせることができます — 例えば、prices.chunks(2).enumerate() を使うと、チャンクのインデックスとチャンクのスライスの両方を一度に取得できます。各 chunk はスライスなので、chunk.len() を呼び出したり、chunk[0]、chunk[1] などのようにインデックスでアクセスしたりできます。
価格の期待される出力形式:
価格を小数点以下2桁にフォーマットするには ${:.2} を使用します。
正確なテキストは 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: iter_mut() を使ってすべての価格に10%の割引を適用する
// Hint: 各 *price に 0.9 を掛ける
println!("\nPrices after 10% discount:");
// TODO: 割引後の各価格を小数点以下2桁にフォーマットして表示する
// 期待される出力形式は指示に示されている
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Fundamentalsのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ