libstd Rust có một thực hiện điều này, các đặc điểm IntoIterator
.
/// Conversion into an `Iterator`
pub trait IntoIterator {
/// The type of the elements being iterated
type Item;
/// A container for iterating over elements of type `Item`
type IntoIter: Iterator<Item=Self::Item>;
/// Consumes `Self` and returns an iterator over it
fn into_iter(self) -> Self::IntoIter;
}
Các đặc điểm có by-value (self
) xây dựng đặc biệt này một cách chính xác để có thể thể hiện cả hai “vào iterator” và “mượn iterator” ngữ nghĩa.
Được chứng minh bằng cách thực hiện IntoIterator
của HashMap. (Họ sử dụng cấu trúc lặp của Hashmap Iter
và IntoIter
.) Điều thú vị ở đây là đặc điểm được triển khai cho loại &HashMap<K, V, S>
để biểu thị “trình vòng lặp mượn”.
impl<'a, K, V, S> IntoIterator for &'a HashMap<K, V, S>
where K: Eq + Hash, S: HashState
{
type Item = (&'a K, &'a V);
type IntoIter = Iter<'a, K, V>;
fn into_iter(self) -> Iter<'a, K, V> {
self.iter()
}
}
impl<K, V, S> IntoIterator for HashMap<K, V, S>
where K: Eq + Hash, S: HashState
{
type Item = (K, V);
type IntoIter = IntoIter<K, V>;
/// Creates a consuming iterator, that is, one that moves each key-value
/// pair out of the map in arbitrary order. The map cannot be used after
/// calling this.
fn into_iter(self) -> IntoIter<K, V> {
/* ... */
}
}
Nếu sử dụng một loại liên quan như đề xuất trong các câu trả lời dưới đây là không phù hợp (có thể không), sau đó bạn có thể trở lại một 'Hộp> 'để thay thế. Nhưng điều này sẽ đòi hỏi một sự phân bổ đống! –
BurntSushi5