Улучшенный цикл 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]
Задание
ЛегкоСоздайте программу, которая обрабатывает список покупок с товарами и их ценами, и предоставляет различные представления этих данных.
Программа должна:
- Вывести номер каждого товара и его цену (используя
enumerate). Формат:Item N: $Price(например,Item 1: $2.75). - Вывести цены парами (используя
chunks) в виде "пакетных предложений" (bundle deals). Если пакет содержит 2 товара, выведите сумму:Bundle N: $Price1 + $Price2 = $Sum. Если содержит только 1 товар, выведите:Bundle N: $Price. - Применить скидку 10% ко всем ценам (используя
iter_mut). - Вывести итоговые скидочные цены, каждую с новой строки, отформатированные до 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" и т.д.
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Fundamentals
4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияАрифметические сокращенияОператоры сравненияСравнение строк7Основы ввода-вывода
Вывод в консольЧтение ввода пользователяПовторение — До 120Повторение — True или False5Операторы. Часть 2
Логические операторы. Часть 1Логические операторы. Часть 2Повторение — простая логикаЛогические операторы. Часть 38Приложение-калькулятор
Приветственное сообщениеПолучение чисел11Функции
Объявление функцийПараметры и аргументыВозвращаемые значенияМножественные возвращаемые значенияПовторение: функция SigmaПовторение: функция валидации14Итерация по массивам
Работа с диапазонамиУлучшенный цикл forЗаимствование в циклеОсновные операции с массивами3Переменные. Часть 2
Объявление типаСоглашения об именованииВывод типовПовторение: инициализация переменныхПриведение типов9Циклы
Цикл For по последовательностиЦикл WhileОператор BreakОператор ContinueВложенные циклыМетки цикловБесконечный циклПовторение — Динамический ввод