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 может быть меньше, если массив не делится нацело.

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

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

Здесь .chunks(2) сначала создаёт slice, а затем .enumerate() обёртывает каждый из них счётчиком — поэтому i — это индекс chunk, а chunk — это slice.

  • Итерация с изменением (мутацией):

    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 знаков после запятой.

Попробуйте сами

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} — например, "Item 1: $2.75"


    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, выведите: "Bundle 4: $7.90"
    // Используйте {:.2} для форматирования всех цен до 2 знаков после запятой


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


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

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

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

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