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 utilizar 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 equitativamente.
También puedes encadenar .enumerate() sobre .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 compras con artículos y sus precios, y proporcione diferentes vistas de los datos.
El programa debe:
- Imprimir el número de cada artículo y su precio (usando
enumerate). Formatea comoItem N: $Price(por ejemplo,Item 1: $2.75). - Imprimir los precios en pares (usando
chunks) como "ofertas en paquete" ("bundle deals"). 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).
Pista: Puedes encadenar iteradores — por ejemplo, prices.chunks(2).enumerate() te da tanto el índice del fragmento como la rebanada (slice) del fragmento a la vez. Cada chunk es un slice, por lo que puedes llamar a chunk.len() en él e indexar en él con chunk[0], chunk[1], etc.
Formato de salida esperado para los precios:
Usa ${:.2} para formatear los precios a 2 decimales.
El texto exacto es Bundle 4: $7.90.
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
// Hint: prices.iter().enumerate() da pares (index, &price)
// Formatea los precios a 2 decimales usando {:.2}, consulta las instrucciones para el formato exacto
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 indica su tamaño
// If chunk.len() == 2, print: "Bundle 1: $2.75 + $1.50 = $4.25"
// Si chunk.len() == 1, imprime la línea del ítem único descrita en las instrucciones
// Usa {:.2} para formatear todos los precios a 2 decimales
// TODO: Usa iter_mut() para aplicar un descuento del 10% a todos los precios
// Hint: multiplica cada *price por 0.9
println!("\nPrices after 10% discount:");
// TODO: Imprime cada precio con descuento formateado a 2 decimales
// El formato de salida esperado se muestra en las instrucciones
}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ámicaPractica por tu cuenta: Compilador de Rust online