Rust - Iterator and Closure

Mickey·2022년 1월 15일
0

Rust

목록 보기
27/32
post-thumbnail
post-custom-banner

https://www.tutorialspoint.com/rust/rust_iterator_and_closure.htm

Iterators

반복자는 배열, 벡터, 지도 등과 같은 값 모음을 반복하는 데 도움
반복자는 Rust 표준 라이브러리에 정의된 Iterator trait을 구현
iter() 메서드는 컬렉션의 iterator 객체를 반환
iterator 객체의 값을 item이라고 함
iterator의 next() 메서드는 item을 순회하는 데 사용
next() 메서드는 컬렉션의 끝에 도달하면 None 값을 반환

fn main() {
   //declare an array
   let a = [10,20,30];

   let mut iter = a.iter(); 
   // fetch an iterator object for the array
   println!("{:?}",iter);

   //fetch individual values from the iterator object
   println!("{:?}",iter.next());
   println!("{:?}",iter.next());
   println!("{:?}",iter.next());
   println!("{:?}",iter.next());
}

array나 vector 같은 collection이 Iterator trait을 구현하는 경우 for...in 구문을 사용하여 탐색할 수 있음

fn main() {
   let a = [10,20,30];
   let iter = a.iter();
   for data in iter{
      print!("{}\t",data);
   }
}

다음 3가지 메서드는 컬렉션에서 반복자 개체를 반환
여기서 T는 컬렉션의 항목을 나타냄

Sr.No.MethodDescription
1iter()&T(T에 대한 참조)에 대한 반복자를 제공
2into_iter()T에 대한 반복자를 제공
3iter_mut()&mut T에 대한 반복자를 제공

iter()

iter() 함수는 borrow의 개념을 사용
컬렉션의 각 요소에 대한 참조를 반환하여 컬렉션을 변경하지 않고 루프 후에 재사용

fn main() {
   let names = vec!["Kannan", "Mohtashim", "Kiran"];
   for name in names.iter() {
      match name {
         &"Mohtashim" => println!("There is a rustacean among us!"),
         _ => println!("Hello {}", name),
      }
   }
   println!("{:?}",names); 
   // reusing the collection after iteration
}


into_iter()

into_iter()는 소유권 개념을 사용
컬렉션의 값을 iter 객체로 이동
즉, 컬렉션은 소비되고 더 이상 재사용할 수 없음

fn main(){
   let names = vec!["Kannan", "Mohtashim", "Kiran"];
   for name in names.into_iter() {
      match name {
         "Mohtashim" => println!("There is a rustacean among us!"),
         _ => println!("Hello {}", name),
      }
   }
   // cannot reuse the collection after iteration
   //println!("{:?}",names); 
   //Error:Cannot access after ownership move
}


for and iter_mut()

iter() 함수와 같으나 컬렉션 내의 요소를 수정할 수 있음

fn main() {
   let mut names = vec!["Kannan", "Mohtashim", "Kiran"];
   for name in names.iter_mut() {
      match name {
         &mut "Mohtashim" => println!("There is a rustacean among us!"),
         _ => println!("Hello {}", name),
      }
   }
   println!("{:?}",names);
   //// reusing the collection after iteration
}


Closure

클로저는 다른 함수 내의 함수를 나타냄
클로저는 익명함수
클로저를 사용하여 변수에 함수를 할당할 수 있음
함수에 매개변수로 함수를 전달 가능
클로저는 인라인 함수라고도 함
외부 함수의 변수는 인라인 함수로 엑세스 가능

클로저 정의

클로저 정의는 선택적으로 매개변수를 가질 수 있음
매개변수는 두 개의 vertical bar(|)로 둘러쌓임

// defining
let closure_function = |parameter| {
   //logic
}

// invoking
closure_function(parameter);
fn main(){
   let is_even = |x| {
      x%2==0
   };
   let no = 13;
   println!("{} is even ? {}",no,is_even(no));
}

클로저는 상위 함수의 변수들을 참조 가능

fn main(){
   let val = 10; 
   // declared outside
   let closure2 = |x| {
      x + val //inner function accessing outer fn variable
   };
   println!("{}",closure2(2));
}

profile
Mickey
post-custom-banner

0개의 댓글