Улучшенный цикл for
Часть раздела Основы путешествия по Rust на Coddy. Урок 66 из 75.
Существует несколько способов перебрать массив, вот некоторые из них:
Рассмотрим следующий массив:
let numbers = [1, 2, 3, 4, 5];Прямой итератор:
for num in numbers.iter() {} // Значения: 1, 2, 3, 4, 5
index и значение:
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(), чтобы одновременно получить и индекс, и фрагмент:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// Значения: (0,[1,2]), (1,[3,4]), (2,[5])Здесь .chunks(2) сначала создаёт срезы, затем .enumerate() оборачивает каждый из них счётчиком, поэтому i — это индекс фрагмента, а chunk — срез.
Итерирование с изменением:
for num in numbers.iter_mut() { *num *= 2; } // Массив становится: [2, 4, 6, 8, 10]
Задание
ЛегкоСоздай программу, которая обрабатывает список покупок с товарами и их ценами и предоставляет разные представления данных.
Программа должна:
- Вывести номер и цену каждого товара (используя
enumerate). Формат:Item N: $Price(например,Item 1: $2.75). - Вывести цены парами (используя
chunks) как "bundle deals". Если в Bundle 2 товара, выведи сумму:Bundle N: $Price1 + $Price2 = $Sum. Если в нём только 1 товар, выведи:Bundle N: $Price. - Примени скидку 10% ко всем ценам (используя
iter_mut). - Выведи итоговые цены со скидкой, каждую с новой строки, с форматированием до 2 десятичных знаков (например,
$2.48).
Hint: Ты можешь объединять итераторы в цепочку, например, prices.chunks(2).enumerate() даёт тебе одновременно и индекс chunk, и срез chunk. Каждый 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: Use iter_mut() to apply a 10% discount to all prices
// Подсказка: умножьте каждый *price на 0.9
println!("\nPrices after 10% discount:");
// TODO: Выведите каждую цену со скидкой, отформатированную до 2 знаков после запятой
// Ожидаемый формат вывода показан в инструкциях
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияАрифметические сокращенияОператоры сравненияСравнение строк7Основы ввода-вывода
Вывод в консольЧтение ввода пользователяПовторение — До 120Повторение — True или False5Операторы. Часть 2
Логические операторы. Часть 1Логические операторы. Часть 2Повторение — простая логикаЛогические операторы. Часть 38Приложение-калькулятор
Приветственное сообщениеПолучение чисел11Функции
Объявление функцийПараметры и аргументыВозвращаемые значенияМножественные возвращаемые значенияПовторение: функция SigmaПовторение: функция валидации14Итерация по массивам
Работа с диапазонамиУлучшенный цикл forЗаимствование в циклеОсновные операции с массивами3Переменные. Часть 2
Объявление типаСоглашения об именованииВывод типовПовторение: инициализация переменныхПриведение типов9Циклы
Цикл For по последовательностиЦикл WhileОператор BreakОператор ContinueВложенные циклыМетки цикловБесконечный циклПовторение — Динамический вводПотренируйтесь самостоятельно: Онлайн-компилятор Rust