Iterator는 보통 루프에서 작동할 값의 시퀀스를 생성하는 값. Rust의 표준 라이브러리는 벡터, 문자열, 해시 테이블 및 기타 컬렉션을 순회하는 Iterator를 제공할 뿐만 아니라, 입력 스트림에서 텍스트의 줄을 생성하거나 네트워크 서버에서 도착하는 연결, 다른 스레드에서 통신 채널을 통해 수신되는 값 등도 Iterator로 처리할 수 있다.

And of course, you can implement iterators for your own purposes. Rust’s for loop provides a natural syntax for using iterators, but iterators themselves also provide a rich set of methods for mapping, filtering, joining, collecting, and so on.

물론, 목적에 맞게 Iterator를 직접 구현할 수도 있다. Rust의 for 루프는 Iterator를 사용하는 자연스러운 syntax를 제공하지만, Iterator 자체는 매핑, 필터링, 조인, 수집 등의 다양한 메서드를 제공함.

Rust’s iterators are flexible, expressive, and efficient. Consider the following function, which returns the sum of the first n positive integers.

Rust의 Iterator는 유연하고 표현력이 뛰어나며 효율적.

fn triangle(n: i32) -> i32 {
		let mut sum = 0;
		for i in 1..=n {
				sum += i;
		}
		sum
}

The expression 1..=n is a RangeInclusive<i32> value. A RangeInclusive<i32> is an iterator that produces the integers from its start value to its end value (both inclusive), so you can use it as the operand of the for loop to sum the values from 1 to n.

표현식 1..=nRangeInclusive<i32> 타입의 값으로 RangeInclusive<i32>는 시작 값부터 끝 값까지의 모든 정수를 생성하는 Iterator를 나타낸다. 따라서 이 코드는 1부터 n까지의 모든 정수를 순회하면서 sum 변수에 각각의 값을 더한다.

그러나 Iterator에는 fold 가 있으며, 이를 사용하여 동일한 기능을 구현할 수 있다.


fn triangle(n: i32) -> i32 {
		(1..=n).fold(0, |sum, item| sum + item)
}

Starting with 0 as the running total, fold takes each value that 1..=n produces and applies the closure |sum, item| sum + item to the running total and the value. The closure’s return value is taken as the new running total. The last value it returns is what fold itself returns—in this case, the total of the entire sequence. This may look strange if you’re used to for and while loops, but once you’ve gotten used to it, fold is a legible and concise alternative.

초기값을 0으로 설정하고, 1..=n이 생성하는 각 값을 가져와서 클로저 |sum, item| sum + item을 실행한다. 이 클로저는 현재 총합(sum)과 현재 값을(item) 더한 결과를 반환하며, 반환된 값이 새로운 총합으로 사용된다. fold가 반환하는 마지막 값이 전체 시퀀스의 총합이 된다.

이 방식은 for 루프나 while 루프에 익숙하다면 낯설 수 있지만, 익숙해지면 fold는 가독성이 좋고 간결한 대안이 될 수 있다.

This is pretty standard fare for functional programming languages, which put a premium on expressiveness. But Rust’s iterators were carefully designed to ensure that the compiler can translate them into excellent machine code as well. In a release build of the second definition shown before, Rust knows the definition of fold and inlines it into triangle. Next, the closure |sum, item| sum + item is inlined into that.

이것은 표현력을 중요시하는 함수형 프로그래밍 언어에서 꽤 표준적인 방식이다. 그러나 Rust의 Iterator는 컴파일러가 이를 뛰어난 기계어 코드로 변환할 수 있도록 신중하게 설계됐다. 앞서 보여준 두 번째 코드에서, Rust는 fold의 정의를 알고 이를 triangle 함수에 인라인한다. 다음으로, 클로저 |sum, item| sum + item도 그 안에 인라인된다.

Finally, Rust examines the combined code and recognizes that there’s a simpler way to sum the numbers from one to n: the sum is always equal to n * (n+1) / 2. Rust translates the entire body of triangle, loop, closure, and all, into a single multiplication instruction and a few other bits of arithmetic.

마지막으로, Rust는 결합된 코드를 분석하고 1부터 n까지의 숫자를 더하는 더 간단한 방법이 있다는 것을 인식한다. 그 합계는 항상n * (n+1) / 2와 같다. Rust는 triangle 함수의 전체 본문을, 루프와 클로저를 포함하여, 단일 곱셈 명령어와 몇 가지 다른 산술 연산으로 변환한다.