Lý do thiết kế cho việc Vec
khô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 Vec
khô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 IntoIterator
khi 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_mut
lặp lại có thể thay đổi.
ys
trong 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
Vec
khô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 Iterator
trực tiếp, vì Iterator
cầ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; drain
là khác nhau ở chỗ nó chỉ làm trống vector.