좀 더 명확히 할 것이 있다고 생각합니다. 컬렉션과 같은 종류의, Vec<T>
그리고 VecDeque<T>
,이 into_iter
수익률이 있다는 방법 T
들이 구현 때문에를 IntoIterator<Item=T>
. Foo<T>
반복되는 유형을 작성하는 것을 막을 수있는 것은 없습니다 . T
다른 유형이 아닙니다 U
. 즉,를 Foo<T>
구현 IntoIterator<Item=U>
합니다.
사실, 몇 가지 예제가 있습니다 std
: &Path
구현 IntoIterator<Item=&OsStr>
및 &UnixListener
구현합니다 IntoIterator<Item=Result<UnixStream>>
.
차이 into_iter
및iter
의 차이에 원래의 질문으로 돌아 가기 into_iter
와 iter
. 다른 사람들이 지적한 것과 마찬가지로 차이점은에 지정된 모든 유형을 생성 할 수 into_iter
있는 필수 방법입니다 . 일반적으로, 타입 구현하는 경우 그것은 또한 두 개의 임시 방법을이 규칙에 따라, : 그리고 어떤 수율 및 각각.IntoIterator
IntoIterator::Item
IntoIterator<Item=I>
iter
iter_mut
&I
&mut I
의미 into_iter
하는 것은 특성 바인딩을 사용하여 메소드 가있는 유형 (즉 반복 가능) 을받는 함수를 만들 수 있다는 것입니다.
fn process_iterable<I: IntoIterator>(iterable: I) {
for item in iterable {
// ...
}
}
그러나, 우리는 할 수없는 * 가지고 유형을 요구하는 바인딩 특성 사용 iter
방법 또는 iter_mut
그들은 단지 규칙이기 때문에, 방법. 또는 into_iter
보다 더 널리 사용할 수 있다고 말할 수 있습니다 .iter
iter_mut
대안 iter
및iter_mut
관찰해야 할 또 다른 흥미로운 점 iter
은 반복자를 얻는 유일한 방법은 아닙니다 &T
. 관례에 따르면, 메소드 SomeCollection<T>
가 std
있는 콜렉션 유형 iter
에도 불변의 참조 유형이 &SomeCollection<T>
구현 IntoIterator<Item=&T>
됩니다. 예를 들어 &Vec<T>
implements IntoIterator<Item=&T>
이므로 다음을 반복 할 수 있습니다 &Vec<T>
.
let v = vec![1, 2];
// Below is equivalent to: `for item in v.iter() {`
for item in &v {
println!("{}", item);
}
경우 v.iter()
에 해당합니다 &v
구현하는 두 점에서 IntoIterator<Item=&T>
, 왜 다음 녹 모두를 제공합니까? 인체 공학적입니다. for
루프 에서는 사용하기 &v
보다 약간 더 간결합니다 v.iter()
. 그러나 다른 경우에는 다음 v.iter()
보다 훨씬 명확합니다 (&v).into_iter()
.
let v = vec![1, 2];
let a: Vec<i32> = v.iter().map(|x| x * x).collect();
// Although above and below are equivalent, above is a lot clearer than below.
let b: Vec<i32> = (&v).into_iter().map(|x| x * x).collect();
마찬가지로 for
루프에서 다음 v.iter_mut()
과 &mut v
같이 바꿀 수 있습니다 .
let mut v = vec![1, 2];
// Below is equivalent to: `for item in v.iter_mut() {`
for item in &mut v {
*item *= 2;
}
유형에 대한 제공 (구현) into_iter
및 iter
방법
유형에 반복 할 "way"가 하나만 있으면 두 가지를 모두 구현해야합니다. 그러나 두 가지 이상의 방법을 반복 할 수있는 경우 각 방법마다 임시 방법을 제공해야합니다.
예를 들어, String
도 제공 into_iter
이나 iter
문자의 표현 바이트 또는 반복의 표현을 반복 : 반복하는 두 가지 방법이 있기 때문에 그것. 대신, 메소드의 대안으로 bytes
바이트 chars
반복 및 문자 반복을 위한 두 가지 방법을 제공합니다 iter
.
* 기술적으로 특성을 만들어서 할 수 있습니다. 그러나 우리는 우리가 impl
사용하고자하는 각 유형마다 그 특성이 필요 합니다. 한편 많은 유형의 std
이미 구현되어 IntoIterator
있습니다.