Lý do thiết kế cho việc Veckhông thực hiện các Iteratorđặc điểm là gì? Phải luôn luôn gọi iter()trên tất cả các vectơ và lát cắt để tạo ra các dòng mã dài hơn.
Thí dụ:
let rx = xs.iter().zip(ys.iter());
so với Scala:
val rx = xs.zip(ys)
Lý do thiết kế cho việc Veckhông thực hiện các Iteratorđặc điểm là gì? Phải luôn luôn gọi iter()trên tất cả các vectơ và lát cắt để tạo ra các dòng mã dài hơn.
Thí dụ:
let rx = xs.iter().zip(ys.iter());
so với Scala:
val rx = xs.zip(ys)
Câu trả lời:
Một vòng lặp có trạng thái lặp. Nó phải biết những gì sẽ là yếu tố tiếp theo để cung cấp cho bạn.
Vì vậy, một vectơ tự nó không phải là một trình vòng lặp và sự khác biệt là rất quan trọng. Bạn có thể có hai lần lặp trên cùng một vectơ, ví dụ, mỗi lần lặp có trạng thái lặp cụ thể.
Nhưng một vectơ có thể cung cấp cho bạn một trình vòng lặp, đó là lý do tại sao nó thực hiện IntoIterator, cho phép bạn viết điều này:
let v = vec![1, 4];
for a in v {
dbg!(a);
}
Nhiều hàm mất IntoIteratorkhi cần một trình vòng lặp, và đó là trường hợp zip, đó là lý do tại sao
let rx = xs.iter().zip(ys.iter());
có thể được thay thế bằng
let rx = xs.iter().zip(ys);
xs.zip(ys)làm việc ở Scala? Là một iterator (trạng thái) tự động được tạo trong Scala? Hay "kiểu danh sách" của nó luôn chứa trạng thái lặp? Bất cứ giải pháp nào Scala sử dụng: tại sao Rust không sử dụng nó?
iter(), into_iter()và iter_mut()rất quan trọng.
iter) và yêu cầu một cuộc gọi rõ ràng để iter_mutlặp lại có thể thay đổi.
ystrong xs.iter().zip (ys): làm thế nào để bạn chọn sử dụng ys.iter()hoặc ys.iter_mut()?
ys, chúng tôi sử dụng into_iter. Lý do rất đơn giản: ysđược tiêu thụ, vì vậy các loại iterator khác không có ý nghĩa.
Lý do thiết kế cho việc
Veckhông thực hiện cácIteratorđặc điểm là gì?
Nó nên thực hiện trong số ba vòng lặp? Có ba loại trình vòng lặp khác nhau mà bạn có thể nhận được từ Vec:
vec.iter()cho Iterator<Item = &T>,vec.iter_mut()đưa ra Iterator<Item = &mut T>và sửa đổi các vectơ vàvec.into_iter()đưa ra Iterator<Item = T>và tiêu thụ vector trong quá trình.so với Scala:
Trong Scala, nó cũng không thực hiện Iteratortrực tiếp, vì Iteratorcần con trỏ mục tiếp theo mà bản thân vectơ không có. Tuy nhiên, vì Scala không có ngữ nghĩa di chuyển, nó chỉ có một cách để tạo một trình vòng lặp từ một vectơ, do đó, nó có thể thực hiện chuyển đổi hoàn toàn. Rust có ba phương pháp, vì vậy nó phải hỏi bạn muốn dùng phương pháp nào.
into_iter()là một trong những tiêu thụ vector; drainlà khác nhau ở chỗ nó chỉ làm trống vector.