๐จ ํ์ฌ ๊ณต๋ถํ๊ณ ์๋ ๋ด์ฉ์ผ๋ก ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค.
iterator
๋ vector, ๋ฐฐ์ด ๋ฑ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์ํํ ๋ ์ฉ์ดํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ข
๋ฅ๋ก๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
.iter()
-> reference์ ํํ๋ก iterator ์์ฑ.iter_mut()
-> mut ref์ ํํ๋ก iterator ์์ฑ.into_iter()
-> ์ค์ value๋ก iterator ์์ฑ์์๋ฅผ ๋ณด๋ ๊ฒ์ด ํจ์ฌ ์ดํดํ๊ธฐ ์ฝ๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด map()
์ ๋ํด ๋จผ์ ์ดํด๋ณด์.
core::iter::traits::iterator::Iterator
pub fn map<B, F>(self, f: F) -> Map<Self, F>
where
Self: Sized,
F: FnMut(Self::Item) -> B,
map()
์ ๋ฐ๋ณต๋ฌธ์ด๋ ๋น์ทํ๊ฒ ์๊ฐํ ์ ์๋๋ฐ, iterator ๋ค์ ์ฌ์ฉํ๊ณ FnMut Closure๋ฅผ ์ธ์๋ก ๋ฐ์์ iterator๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ค.
๊ทธ ๋ค์์ผ๋ก ์ดํด๋ณผ ๊ฒ์ collect
๋ค.
core::iter::traits::iterator::Iterator
pub fn collect<B>(self) -> B
where
B: FromIterator<Self::Item>,
Self: Sized,
collect
๋ iterator๋ฅผ ๋ฐ์์ ๋ค๋ฅธ ํ์
์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์์ฃผ ์ ์ฉํ ํจ์๋ค. collect
๋ค์ ๋ฐ๊พธ๊ณ ์ถ์ ํ์
์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
ํ์ํ ๊ฒ์ ๋ชจ๋ ๋ดค์ผ๋ ์ด์ ์์ ๋ฅผ ๋ณด๋๋ก ํ์.
fn main() {
let vector1 = vec![1, 2, 3];
let vector1_a = vector1.iter().map(|x| x + 1).collect::<Vec<i32>>();
let vector1_b = vector1.into_iter().map(|x| x * 10).collect::<Vec<i32>>();
let mut vector2 = vec![10, 20, 30]; // we will use .iter_mut() on this one
vector2.iter_mut().for_each(|x| *x +=100);
println!("{:?}", vector1_a);
println!("{:?}", vector2);
println!("{:?}", vector1_b);
}
์ฒซ ๋ฒ์งธ vector1์ .iter()
๋ฅผ ์ฌ์ฉํด์ map์ ์ ๋ฌํ๊ณ , map์ closure๋ฅผ ์ด์ฉํด iterator
๋ฅผ ๋ฆฌํดํ๋ค. ์์ฑ๋ iterator๋ฅผ collector๊ฐ ๋ฐ์์ Vec ํ์
์ผ๋ก ์๋ก์ด vector๋ฅผ ๋ง๋ค์ด vector1_a์ ํ ๋นํ๋ค. ์ด ๋ .iter()
๋ reference์ ํํ๋ก iterator๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ์ฌ์ฉํ vector1์ ๊ทธ๋๋ก ์ด์์๋ค.
์ด์ ๋ ๋ฒ์งธ๋ฅผ ๋ณด๋ฉด ์ฒซ ๋ฒ์งธ์ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ง๋ง .into_iter()
๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ๋ง ๋ค๋ฅด๋ค. .into_iter()
๋ ๊ธฐ์กด์ ์ฌ์ฉํ vector1์ ์๋นํ๊ธฐ ๋๋ฌธ์ .into_iter()
๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ฉด ๋ ์ด์ vector1์ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก iter_mut()
๋ฅผ ๋ณด๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ref ํํ๋ก iterator๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ vector2๋ ๊ทธ๋๋ก ์ด์์๋ค. ์ฌ๊ธฐ์๋ map()
๋์ for_each
๋ฅผ ์ฌ์ฉํ๋๋ฐ, for_each
๋ collect ๋ฅผ ์ฌ์ฉํ ํ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.