Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Vector và nested loop trong Rust
#Day016
Mấy nay đang phải làm Rust lại nên lại viết TIL về Rust.
Một trường hợp lỗi mà ai cũng có thể mắc phải khi làm việc với vòng lặp for lồng nhau trong Rust, lấy ví dụ:
let a = vec![1, 2, 3];
let b = vec![4, 5, 6];
for i in a {
for j in b {
// do something
}
}
Đoạn code trên sẽ gặp ngay một cái lỗi khá là hiển nhiên, đó là:
|
23 | for j in b {
| ^ value moved here in previous iteration of loop
|
= note: move occurs because `b` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
Lý do ở đây là ngay từ sau lần lặp đầu tiên bên trong a
, thì biến b
đã được moved vào trong scope này, dẫn tới lần lặp thứ 2 (thuộc một scope khác) thì b
không còn truy cập được nữa.
Giải pháp cho trường hợp này là chỉ lấy tham chiếu của vector cần lặp thay vì chính vector đó để tránh bị moved, trong Rust thì ta có thể lấy tham chiếu của một vector dưới dạng một slice, thông qua hàm as_slice()
, đoạn code trên có thể sửa lại thành:
for i in a.as_slice() {
for j in b.as_slice() {
// do something
}
}
huytd 21-02-2018






