Bucle for mejorado
Parte de la sección Fundamentos del Journey de Rust de Coddy. Lección 66 de 75.
Hay distintas formas de iterar sobre un array; estas son 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)
Segmentos de tamaño específico:
for chunk in numbers.chunks(2) { } // Valores: [1,2], [3,4], [5]Cada segmento 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 segmento. El último segmento puede ser más pequeño si el array no se divide de manera uniforme.
También puedes encadenar .enumerate() a .chunks() para obtener un índice y 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 primero los fragmentos, después .enumerate() envuelve cada uno con un contador, de modo que i es el índice del fragmento y chunk es el segmento.
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 y el precio de cada artículo (usando
enumerate). Formatea comoItem N: $Price(por ejemplo,Item 1: $2.75). - Imprimir los precios en pares (usando
chunks) como «ofertas combinadas». Si una oferta tiene 2 artículos, imprime la suma:Bundle N: $Price1 + $Price2 = $Sum. Si solo tiene 1 artículo, imprime:Bundle N: $Price. - Aplica un descuento del 10 % a todos los precios (usando
iter_mut). - Imprime los precios finales con descuento, cada uno en una línea nueva, con un formato de 2 decimales (por ejemplo,
$2.48).
Pista: Puedes encadenar iteradores, por ejemplo, prices.chunks(2).enumerate() te proporciona a la vez el índice del fragmento y el fragmento de la lista. Cada chunk es un fragmento, por lo que puedes llamar a chunk.len() y acceder a sus elementos mediante chunk[0], chunk[1], etc.
Formato de salida esperado para los precios:
Usa ${:.2} para formatear los precios con 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 artículo 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 artículo individual descrita en las instrucciones
// Usa {:.2} para formatear todos los precios a 2 decimales
// TODO: Use iter_mut() to apply a 10% discount to all prices
// 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 Fundamentos
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