拡張 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.len()は、そのチャンクに含まれる要素数を返します。配列の要素数が割り切れない場合、最後のチャンクは小さくなることがあります。
.chunks()に.enumerate()を連結すると、インデックスとチャンクを同時に取得することもできます。
for (i, chunk) in numbers.chunks(2).enumerate() { }
// 値: (0,[1,2]), (1,[3,4]), (2,[5])ここでは、まず.chunks(2)がスライスを生成し、次に.enumerate()がそれぞれにカウンターを付けるため、iはチャンクのインデックス、chunkはスライスです。
変更を加えながら反復する:
let mut numbers = [1, 2, 3, 4, 5]; for num in numbers.iter_mut() { *num *= 2; } // 配列は次のようになります: [2, 4, 6, 8, 10]
チャレンジ
簡単買い物リストの品目と価格を処理し、データをさまざまな形式で表示するプログラムを作成してください。
プログラムでは、次の処理を行います。
- 各品目の番号と価格を表示します(
enumerateを使用)。Item N: $Priceの形式にします(例:Item 1: $2.75)。 - 価格を2つずつ組にして(
chunksを使用)、"bundle deals"として表示します。組に品目が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() を使って、各商品の番号と価格を表示する
// ヒント: prices.iter().enumerate() は (index, &price) のペアを返す
// {:.2} を使って価格を小数点以下2桁で表示する。正確な形式は説明を参照
println!("\nBundle Deals:");
// TODO: chunks(2) と enumerate() をつなげて使う: prices.chunks(2).enumerate()
// これにより (index, chunk) のペアが得られる。各 chunk はスライスなので、chunk.len() でその長さがわかる
// chunk.len() == 2 の場合、"Bundle 1: $2.75 + $1.50 = $4.25" を表示する
// chunk.len() == 1 の場合、説明に記載された単品用の行を表示する
// {:.2} を使って、すべての価格を小数点以下2桁で表示する
// TODO: iter_mut() を使って、すべての価格に 10% discount を適用する
// ヒント: 各 *price に 0.9 を掛ける
println!("\nPrices after 10% discount:");
// TODO: 割引後の各価格を小数点以下2桁で表示する
// 想定される出力形式は説明に記載されている
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ