[Rust] Iterator

김민재·2023년 2월 6일

Rust Basic

목록 보기
2/3
post-thumbnail

이터레이터의 정의

러스트에서 이터레이터란 std::iter::Iterator 트레이트를 구현하고 있는 모든 값을 의미하고 있음
아래 정의는 std::iter::Iterator 여기서 확인이 가능하다.
Required는 새로운 타입에 대해정의할 경우 반드시 정의해야 한다는 의미
Provied는 기본형으로 제공된다는 의미고, 유저가 재 정의해서 사용이 가능하다는의미

pub trait Iterator {
	// Required Associated Types
	type Item; 
    // Required Methods
    fn next(&mut self) -> Option<Self:Item>;
    
    // Provied Methods 
    fn collect<B>(self) -> B where
    	B: FromIterator<Self::Item>,
    	Self: Sized,
    fn fold<B, F>(self, init: B, f: F) -> B where
    	Self: Sized,
    	F: FnMut(B, Self::Item) -> B,   
    fn filter<P>(self, predicate: P) -> Filter<Self, P> where
    	Self: Sized,
    	P: FnMut(&Self::Item) -> bool,
    ....

std::inter::IntoIterator는 기본으로 Iterator를 가지고 있으며,
into_inter() 메서드 호출시 이터레이터를 리턴해준다

pub trait IntoIterator {
    type Item;
    type IntoIter: Iterator<Item = Self::Item>;
    fn into_iter(self) -> Self::IntoIter;
}

이렇게 std::iter::Iterator, std::iter::IntoIterator 2개의 trait의 기본형을 나열했는데 2개의 바운더리는 IntoIterator가 Iterator를 감싸고 있다.
IntoIterator를 가지고 있는 값을 이터러블 하다 라고 하며, for loop를 사용해서 값을 읽을수 있다

기본 컬렉션 타입에서 이터레이터 사용하는법

iter와 iter_mut 메서드

std::collections::<~~> 문서를 참고하면 대부분 iter, iter_mut가 구현되어 있다

pub fn iter(&self) -> Iter<'_, T>
pub fn iter_mut(&mut self) -> IterMut<'_, T>

이렇게 메서드 정의가 가능한 이유는

impl<'a, T> Iterator for Iter<'a, T>
    type Item = &'a T;
impl<'a, T> Iterator for Iter<'a, T>
    type Item = &'a T;

위 코드와 같이 Iter 트레이트에 대해 제네릭(generic)을 사용해 정의가 되어 있기 때문이다.
무튼 사용법은 저 메서드가 구현된 컬렉션에서 메서드를 호출하면 컬렉션의 이터레이터 값을 획득 할 수 있다.

IntoIterator 구현과 &T, &mut T, T 에 따른 구현 필요성

대부분의 컬렉션들 std::collections::<~~>은 여러개의 IntoIterator를 상황에 따라 제공하고 있다.

&T, &mut T, T 이런 조합으로 이렇게 구분하는 필요성은 러스트의 소유권에 따른 내용으로 T타입을 쓸경우 소유권이 넘어간다. &T는 값만 공유하고, &mut T는 공유하여 값을 변경가능하게 한다. 이때 여러개의 스레드에서 값을 변경하지 못하게 하기 위해서 &mut으로 값을 넘겨 받아 사용할 경우 lock을 해버린다.

기본적으로 알아보면 좋은 method
from_fn, successors : 함수나 클로저를 인자로 받아 값을 처리함
drain : 컬렉션의 &mut T을 받아 각 요소의 소유권을 소비자에서 넘겨줌
등이 있고 이에대한 사용법은 문서를 참고 하자... 솔직히 기본 문서 보면 이해 못할게 아니다.

이터레이터 어뎁터 : map, filter

map을 쓰면 map의 파라미터로 받는 클로저에 이터레이터의 item들을 넣어 연산한 값을 다시 이터레이터로 반환함
fitter를 쓰면 조건에 의해 item을 drop함

0개의 댓글