Bucle for mejorado
Parte de la sección Fundamentals del Journey de Rust de Coddy — lección 66 de 75.
Hay diferentes formas de iterar sobre un array, aquí tienes algunas de ellas:
Considera el siguiente array:
let numbers = [1, 2, 3, 4, 5];Iterador directo:
for num in numbers.iter() {} // Valores: 1, 2, 3, 4, 5
Índice y Valor:
for (index, value) in numbers.iter().enumerate() { } // Valores: (0,1), (1,2), (2,3), (3,4), (4,5)
Slices de un tamaño específico:
for chunk in numbers.chunks(2) { } // Valores: [1,2], [3,4], [5]Cada chunk es un slice, por lo que puedes usar métodos de slice en él — por ejemplo,
chunk.len()devuelve cuántos elementos hay en ese chunk. El último chunk puede ser más pequeño si el array no se divide en partes iguales.
También puedes encadenar .enumerate() después de .chunks() para obtener tanto un índice como el fragmento al mismo tiempo:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// Valores: (0,[1,2]), (1,[3,4]), (2,[5])Aquí, .chunks(2) produce los slices primero, después .enumerate() envuelve cada uno con un contador — por lo que i es el índice del fragmento y chunk es el slice.
Iterar con mutación:
for num in numbers.iter_mut() { *num *= 2; } // El array se convierte en: [2, 4, 6, 8, 10]
Desafío
FácilCrea un programa que procese una lista de la compra con artículos y sus precios, y proporcione diferentes vistas de los datos.
El programa debe:
- Imprimir cada número de artículo y su precio (usando
enumerate). Formatea comoItem N: $Price(por ejemplo,Item 1: $2.75). - Imprimir los precios en parejas (usando
chunks) como "ofertas de paquetes". Si un paquete tiene 2 artículos, imprime la suma:Bundle N: $Price1 + $Price2 = $Sum. Si solo tiene 1 artículo, imprime:Bundle N: $Price. - Aplicar un 10% de descuento a todos los precios (usando
iter_mut). - Imprimir los precios finales con descuento, cada uno en una nueva línea, formateados a 2 decimales (por ejemplo,
$2.48).
Sugerencia: Puedes encadenar iteradores — por ejemplo, prices.chunks(2).enumerate() te da tanto el índice del chunk como la slice del chunk a la vez. Cada chunk es una slice, por lo que puedes llamar a chunk.len() en él e indexarlo con chunk[0], chunk[1], etc.
Formato de salida esperado para los precios:
Usa ${:.2} para formatear los precios a 2 posiciones decimales.
Pruébalo tú mismo
fn main() {
let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];
println!("Original Prices:");
// TODO: Usa enumerate() para imprimir el número de cada ítem y el precio
// Pista: prices.iter().enumerate() da pares (index, &price)
// Formatea los precios a 2 decimales usando {:.2} — p. ej., "Item 1: $2.75"
println!("\nBundle Deals:");
// TODO: Encadena chunks(2) y enumerate() juntos: prices.chunks(2).enumerate()
// Esto da pares (index, chunk) — cada chunk es un slice, así que chunk.len() te dice su tamaño
// If chunk.len() == 2, print: "Bundle 1: $2.75 + $1.50 = $4.25"
// Si chunk.len() == 1, imprime: "Bundle 4: $7.90"
// Usa {:.2} para formatear todos los precios a 2 decimales
// TODO: Usa iter_mut() para aplicar un descuento del 10% a todos los precios
// Pista: multiplica cada *price por 0.9
println!("\nPrices after 10% discount:");
// TODO: Imprime cada precio con descuento formateado a 2 decimales
// Esperado: "$2.48" etc.
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentals
4Operadores Parte 1
Operadores aritméticosOperador de móduloAtajos aritméticosOperadores de comparaciónComparación de strings5Operadores Parte 2
Operadores lógicos Parte 1Operadores lógicos Parte 2Repaso - Lógica simpleOperadores lógicos Parte 33Variables Parte 2
Declaración de tiposConvenciones de nomenclaturaInferencia de tiposResumen - Inicializar variablesConversión de tipos9Bucles
For sobre seriesBucle WhileBreakContinueBucle anidadoEtiquetas de bucleBucle infinitoResumen - Entrada dinámica