Tại sao Vec không thực hiện đặc điểm Iterator?


Câu trả lời:


14

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);

Câu trả lời chính xác! Điều duy nhất tôi đang tự hỏi ngay bây giờ: tại sao lại 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ó?
Lukas Kalbertodt

5
@ DenysSéguret Bởi vì ở Rust, sự phân biệt giữa iter(), into_iter()iter_mut()rất quan trọng.
Sebastian Redl

2
@ DenysSéguret bạn đúng. Tôi muốn nói chỉ kích hoạt nó cho phép lặp bất biến (sử dụ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.
Jmb

2
Lưu ý rằng cùng một đối số có thể được đưa ra ystrong xs.iter().zip (ys): làm thế nào để bạn chọn sử dụng ys.iter()hoặc ys.iter_mut()?
Jmb

2
Đối với 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.
Cerberus

4

Lý do thiết kế cho việc Veckhông thực hiện các Iteratorđặ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:

  1. vec.iter()cho Iterator<Item = &T>,
  2. vec.iter_mut()đưa ra Iterator<Item = &mut T>và sửa đổi các vectơ và
  3. 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.


4
into_iter()là một trong những tiêu thụ vector; drainlà khác nhau ở chỗ nó chỉ làm trống vector.
trentcl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.