Menu
Coddy logo textTech

Улучшенный цикл for

Часть раздела Fundamentals путешествия по Rust на Coddy. Урок 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. Последний chunk может быть меньше, если массив не делится нацело.

Вы также можете вызывать .enumerate() по цепочке после .chunks(), чтобы одновременно получить индекс и chunk:

for (i, chunk) in numbers.chunks(2).enumerate() { }
// Значения: (0,[1,2]), (1,[3,4]), (2,[5])

Здесь .chunks(2) сначала создаёт срезы, а затем .enumerate() оборачивает каждый из них счётчиком — таким образом, i — это индекс chunk, а 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) в виде "пакетных предложений" (bundle deals). Если пакет содержит 2 товара, выведите сумму: Bundle N: $Price1 + $Price2 = $Sum. Если содержит только 1 товар, выведите: Bundle N: $Price.
  3. Применить скидку 10% ко всем ценам (используя iter_mut).
  4. Вывести итоговые скидочные цены, каждую с новой строки, отформатированные до 2 знаков после запятой (например, $2.48).

Hint: Вы можете объединять итераторы в цепочки — например, prices.chunks(2).enumerate() сразу предоставляет как индекс чанка, так и срез чанка. Каждый chunk является срезом, поэтому вы можете вызвать для него chunk.len() и обращаться по индексу: chunk[0], chunk[1] и т. д.

Expected output format for prices:
Используйте ${:.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() сообщает его размер
    // If chunk.len() == 2, print: "Bundle 1: $2.75 + $1.50 = $4.25"
    // Если chunk.len() == 1, выведите строку для одного товара, описанную в инструкциях
    // Используйте {:.2} для форматирования всех цен до 2 знаков после запятой


    // TODO: Используйте iter_mut() для применения 10% скидки ко всем ценам
    // Подсказка: умножьте каждый *price на 0.9


    println!("\nPrices after 10% discount:");
    // TODO: Выведите каждую цену со скидкой, отформатированную до 2 знаков после запятой
    // Ожидаемый формат вывода показан в инструкциях

}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Fundamentals

Потренируйтесь самостоятельно: Онлайн-компилятор Rust