Ulepszona pętla for
Część sekcji Podstawy ścieżki Rust w Coddy. Lekcja 66 z 75.
Istnieją różne sposoby iterowania po tablicy. Oto niektóre z nich:
Rozważmy następującą tablicę:
let numbers = [1, 2, 3, 4, 5];Bezpośredni iterator:
for num in numbers.iter() {} // Wartości: 1, 2, 3, 4, 5
Indeks i wartość:
for (index, value) in numbers.iter().enumerate() { } // Wartości: (0,1), (1,2), (2,3), (3,4), (4,5)
Fragmenty o określonym rozmiarze:
for chunk in numbers.chunks(2) { } // Wartości: [1,2], [3,4], [5]Każdy fragment jest wycinkiem, więc możesz używać na nim metod wycinków, na przykład
chunk.len()zwraca liczbę elementów w tym fragmencie. Ostatni fragment może być mniejszy, jeśli tablica nie dzieli się równo.
Możesz też dołączyć .enumerate() do .chunks(), aby jednocześnie uzyskać indeks i fragment:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// Wartości: (0,[1,2]), (1,[3,4]), (2,[5])Tutaj .chunks(2) najpierw tworzy wycinki, a następnie .enumerate() opakowuje każdy z nich licznikiem, więc i to indeks fragmentu, a chunk to wycinek.
Iteruj z modyfikacją:
for num in numbers.iter_mut() { *num *= 2; } // Tablica przyjmuje postać: [2, 4, 6, 8, 10]
Wyzwanie
ŁatwyUtwórz program, który przetwarza listę zakupów zawierającą produkty i ich ceny oraz przedstawia dane w różnych widokach.
Program powinien:
- Wypisać numer każdego produktu i jego cenę (używając
enumerate). Zastosować formatItem N: $Price(np.Item 1: $2.75). - Wypisać ceny parami (używając
chunks) jako "bundle deals". Jeśli zestaw zawiera 2 produkty, wypisać sumę:Bundle N: $Price1 + $Price2 = $Sum. Jeśli zawiera tylko 1 produkt, wypisać:Bundle N: $Price. - Zastosować 10% zniżki do wszystkich cen (używając
iter_mut). - Wypisać końcowe ceny po zniżce, każdą w nowym wierszu, z dokładnością do 2 miejsc po przecinku (np.
$2.48).
Podpowiedź: Możesz łączyć iteratory, na przykład prices.chunks(2).enumerate() jednocześnie zwraca indeks fragmentu i sam fragment. Każdy chunk jest wycinkiem, więc możesz wywołać na nim chunk.len() i odwoływać się do jego elementów za pomocą indeksów, takich jak chunk[0], chunk[1] itd.
Oczekiwany format wyświetlania cen:
Użyj ${:.2}, aby wyświetlić ceny z dokładnością do 2 miejsc po przecinku.
Dokładny tekst to Bundle 4: $7.90.
Spróbuj swoich sił
fn main() {
let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];
println!("Original Prices:");
// TODO: Użyj enumerate(), aby wyświetlić numer i cenę każdej pozycji
// Wskazówka: prices.iter().enumerate() zwraca pary (index, &price)
// Sformatuj ceny do 2 miejsc po przecinku za pomocą {:.2}; dokładny format znajdziesz w instrukcjach
println!("\nBundle Deals:");
// TODO: Połącz chunks(2) i enumerate(): prices.chunks(2).enumerate()
// To zwraca pary (index, chunk); każdy chunk jest wycinkiem, więc chunk.len() podaje jego rozmiar
// Jeśli chunk.len() == 2, wyświetl: "Bundle 1: $2.75 + $1.50 = $4.25"
// Jeśli chunk.len() == 1, wyświetl wiersz dla pojedynczej pozycji opisany w instrukcjach
// Użyj {:.2}, aby sformatować wszystkie ceny do 2 miejsc po przecinku
// TODO: Użyj iter_mut(), aby zastosować 10% discount do wszystkich cen
// Wskazówka: pomnóż każde *price przez 0.9
println!("\nPrices after 10% discount:");
// TODO: Wyświetl każdą cenę po rabacie, sformatowaną do 2 miejsc po przecinku
// Oczekiwany format wyniku jest pokazany w instrukcjach
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
4Operatory, część 1
Operatory arytmetyczneOperator moduloSkrócone operacje arytmetyczneOperatory porównaniaPorównywanie ciągów znaków7Podstawowe wejście i wyjście
Wyświetlanie w konsoliOdczytywanie danych od użytkownikaPowtórka – do 120Powtórka – prawda czy fałsz5Operatory, część 2
Operatory logiczne, część 1Operatory logiczne, część 2Powtórka — prosta logikaOperatory logiczne, część 311Funkcje
Deklarowanie funkcjiParametry i argumentyWartości zwracaneWiele wartości zwracanychPowtórka – funkcja SigmaPowtórka – funkcja walidująca14Iterowanie po tablicach
Przewodnik po zakresachUlepszona pętla forPożyczanie w pętliTypowe operacje na tablicach3Zmienne – część 2
Deklarowanie typuKonwencje nazewnictwaWnioskowanie o typiePodsumowanie – inicjalizacja zmiennychRzutowanie typów9Pętle
Pętla for dla sekwencjiPętla whileInstrukcja breakInstrukcja continuePętle zagnieżdżoneEtykiety pętliPętla nieskończonaPodsumowanie — dynamiczne dane wejściowe12Podstawy tablic
Deklarowanie tablicTablica jako parametrDostęp do elementówModyfikowanie tablicPodsumowanie — czytelny wydruk tablicy15Operacje na ciągach znaków
Metody ciągów znakówMakro format!Konwersja ciągów znakówPowtórka — formatowaniePoćwicz samodzielnie: Kompilator Rust online