https://www.tutorialspoint.com/rust/rust_iterator_and_closure.htm
반복자는 배열, 벡터, 지도 등과 같은 값 모음을 반복하는 데 도움
반복자는 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. | Method | Description |
---|---|---|
1 | iter() | &T(T에 대한 참조)에 대한 반복자를 제공 |
2 | into_iter() | T에 대한 반복자를 제공 |
3 | iter_mut() | &mut T에 대한 반복자를 제공 |
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()는 소유권 개념을 사용
컬렉션의 값을 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
}
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
}
클로저는 다른 함수 내의 함수를 나타냄
클로저는 익명함수
클로저를 사용하여 변수에 함수를 할당할 수 있음
함수에 매개변수로 함수를 전달 가능
클로저는 인라인 함수라고도 함
외부 함수의 변수는 인라인 함수로 엑세스 가능
클로저 정의는 선택적으로 매개변수를 가질 수 있음
매개변수는 두 개의 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));
}