Vòng lặp for nâng cao
Thuộc phần Kiến thức nền tảng trong hành trình Rust của Coddy. Bài học 66 trên 75.
Có nhiều cách để lặp qua một mảng, sau đây là một số cách:
Xét mảng sau:
let numbers = [1, 2, 3, 4, 5];Bộ lặp trực tiếp:
for num in numbers.iter() {} // Giá trị: 1, 2, 3, 4, 5
Chỉ số và giá trị:
for (index, value) in numbers.iter().enumerate() { } // Giá trị: (0,1), (1,2), (2,3), (3,4), (4,5)
Các lát cắt có kích thước cụ thể:
for chunk in numbers.chunks(2) { } // Giá trị: [1,2], [3,4], [5]Mỗi phần là một lát cắt, vì vậy bạn có thể dùng các phương thức của lát cắt, chẳng hạn như
chunk.len()trả về số phần tử trong phần đó. Phần cuối cùng có thể nhỏ hơn nếu mảng không chia hết.
Bạn cũng có thể nối .enumerate() vào .chunks() để lấy cả chỉ số và phần khối cùng lúc:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// Giá trị: (0,[1,2]), (1,[3,4]), (2,[5])Ở đây, .chunks(2) tạo các lát trước, sau đó .enumerate() gắn bộ đếm vào từng lát, vì vậy i là chỉ số của khối và chunk là lát đó.
Lặp qua và thay đổi:
let mut numbers = [1, 2, 3, 4, 5]; for num in numbers.iter_mut() { *num *= 2; } // Mảng trở thành: [2, 4, 6, 8, 10]
Thử thách
DễTạo một chương trình xử lý danh sách mua sắm gồm các mặt hàng và giá của chúng, đồng thời cung cấp những cách hiển thị dữ liệu khác nhau.
Chương trình cần:
- In số thứ tự và giá của từng mặt hàng (dùng
enumerate). Định dạng làItem N: $Price(ví dụ:Item 1: $2.75). - In giá theo từng cặp (dùng
chunks) dưới dạng "bundle deals". Nếu một gói có 2 mặt hàng, hãy in tổng giá:Bundle N: $Price1 + $Price2 = $Sum. Nếu gói chỉ có 1 mặt hàng, hãy in:Bundle N: $Price. - Áp dụng giảm giá 10% cho tất cả giá (dùng
iter_mut). - In giá sau khi giảm, mỗi giá trên một dòng mới, định dạng với 2 chữ số thập phân (ví dụ:
$2.48).
Gợi ý: Bạn có thể nối các trình lặp với nhau. Ví dụ, prices.chunks(2).enumerate() cung cấp đồng thời cho bạn chỉ số của khối và lát cắt của khối đó. Mỗi chunk là một lát cắt, vì vậy bạn có thể gọi chunk.len() và truy cập phần tử bằng chỉ số như chunk[0], chunk[1], v.v.
Định dạng đầu ra dự kiến cho giá:
Dùng ${:.2} để định dạng giá với 2 chữ số thập phân.
Văn bản chính xác là Bundle 4: $7.90.
Tự làm thử
fn main() {
let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];
println!("Original Prices:");
// TODO: Dùng enumerate() để in ra số thứ tự và giá của từng mặt hàng
// Gợi ý: prices.iter().enumerate() tạo ra các cặp (index, &price)
// Dùng {:.2} để định dạng giá với 2 chữ số thập phân. Xem hướng dẫn để biết định dạng chính xác
println!("\nBundle Deals:");
// TODO: Nối chunks(2) với enumerate(): prices.chunks(2).enumerate()
// Cách này tạo ra các cặp (index, chunk). Mỗi chunk là một lát cắt, nên chunk.len() cho biết kích thước của nó
// Nếu chunk.len() == 2, in ra: "Bundle 1: $2.75 + $1.50 = $4.25"
// Nếu chunk.len() == 1, in ra dòng cho một mặt hàng như mô tả trong hướng dẫn
// Dùng {:.2} để định dạng mọi giá với 2 chữ số thập phân
// TODO: Dùng iter_mut() để áp dụng 10% discount cho mọi giá
// Gợi ý: nhân mỗi *price với 0.9
println!("\nPrices after 10% discount:");
// TODO: In ra từng giá sau khi giảm, với 2 chữ số thập phân
// Định dạng đầu ra mong đợi có trong hướng dẫn
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức nền tảng
5Các toán tử phần 2
Các toán tử logic phần 1Các toán tử logic phần 2Ôn tập: logic đơn giảnCác toán tử logic phần 311Hàm
Khai báo hàmTham số và đối sốGiá trị trả vềNhiều giá trị trả vềÔn tập: hàm SigmaÔn tập: hàm kiểm tra tính hợp lệ14Duyệt qua mảng
Hướng dẫn về rangeVòng lặp for nâng caoMượn trong vòng lặpCác thao tác phổ biến với mảng3Biến phần 2
Khai báo kiểu dữ liệuQuy ước đặt tênSuy luận kiểu dữ liệuÔn tập: Khởi tạo biếnÉp kiểu dữ liệu9Vòng lặp
Vòng lặp for qua chuỗiVòng lặp whileBreakContinueVòng lặp lồng nhauNhãn vòng lặpVòng lặp vô hạnÔn tập: Đầu vào động12Kiến thức cơ bản về mảng
Khai báo mảngMảng làm tham sốTruy cập phần tửChỉnh sửa mảngÔn tập: In mảng đẹp mắtTự luyện tập: Trình biên dịch Rust online