2016-09-29 16 views
8

này hoạt động vì Iterator thực hiện rev() nơi self là một DoubleEndedIterator:iterating Xếp trên một & vec so vec.iter()

let vec: Vec<i32> = Vec::new(); 
for x in vec.iter().rev() { 
    //Do stuff 
} 

Tuy nhiên, nếu tôi thay đổi vec.iter().rev()-&vec.rev() nó sẽ không biên dịch vì:

no method named `rev` found for type `std::vec::Vec<i32>` in the current scope 

Hơn nữa:

the method `rev` exists but the following trait bounds were not satisfied: `std::vec::Vec<i32> : std::iter::Iterator`, `[i32] : std::iter::Iterator` 

Nhưng không một vòng lặp for ngầm gọi IntoIterator? Có phải &vec hoặc vec.iter() được coi là thành ngữ Rust?

Trả lời

11

Nếu bạn chỉ đang lặp qua Vec thì &vec là thành ngữ. Điều này hoạt động vì &Vec<T> thực hiện IntoIterator, đó là những gì vòng lặp for sử dụng.

Tuy nhiên, nếu bạn muốn gọi Iterator phương pháp như rev, filter, vv, bạn cần một thực tế Iterator (kể từ Vec không thực hiện Iterator, chỉ IntoIterator).

Vì vậy, đây:

for x in &vec.rev() { 
    ... 
} 

tương đương với:

for x in (&vec.rev()).into_iter() { 
    ... 
} 

ví dụ: không có cơ hội để sử dụng IntoIterator trước khi cố gắng gọi Iterator phương pháp.

3

Đây chỉ là ưu tiên cơ bản của toán tử &. Trong trường hợp đầu tiên, mỗi phương pháp được gọi lần lượt:

vec.iter().rev() 
(vec.iter()).rev() // same 

Trường hợp thứ hai, & liên kết sau khi tất cả các phương pháp:

&vec.rev() 
&(vec.rev()) // same 

Nói chung, sử dụng &vec khi bạn có thể, nhưng khi bạn cần để sử dụng phương thức bộ chuyển đổi trình chuyển đổi lặp, sử dụng iter hoặc into_iter.

Các vấn đề liên quan