ํด๋ก์ (Closure)
ํด๋ก์ ํน์ ๋๋คํํ์์ ์ต๋ช
ํ์
์
๋๋ค. ์ด๋ค์ Fn
,FnMut
, FnOnce
๋ผ๋ ํน๋ณํ ํธ๋ ์์ ๊ตฌํํฉ๋๋ค:
fn apply_with_log(func: impl FnOnce(i32) -> i32, input: i32) -> i32 { println!("Calling function on {input}"); func(input) } fn main() { let add_3 = |x| x + 3; println!("add_3: {}", apply_with_log(add_3, 10)); println!("add_3: {}", apply_with_log(add_3, 20)); let mut v = Vec::new(); let mut accumulate = |x: i32| { v.push(x); v.iter().sum::<i32>() }; println!("accumulate: {}", apply_with_log(&mut accumulate, 4)); println!("accumulate: {}", apply_with_log(&mut accumulate, 5)); let multiply_sum = |x| x * v.into_iter().sum::<i32>(); println!("multiply_sum: {}", apply_with_log(multiply_sum, 3)); }
Fn
(์๋ฅผ ๋ค์ด add_3
)์ ์บก์ฒ๋ ๊ฐ์ ์๋ชจ๋ ๋ณ๊ฒฝ๋ ํ์ง ์๊ณ , ํน์ ์ด๋ค ๊ฒ๋ ์บก์ณํ์ง ์์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋์์ ์ฌ๋ฌ๋ฒ ํธ์ถํ ์ ์์ต๋๋ค.
FnMut
(์๋ฅผ ๋ค์ด accumulate
)๋ ์บก์ฒ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ๋ฒ ํธ์ถ์ ๊ฐ๋ฅํ์ง๋ง ๋์์ ํธ์ถ ํ ์๋ ์์ต๋๋ค.
FnOnce
(์๋ฅผ ๋ค์ด multiply_sum
)๋ ํ๋ฒ๋ง ํธ์ถ๋๋ฉฐ ์บก์ฒ๋ ๊ฐ์ ์๋ชจํฉ๋๋ค.
FnMut
๋ FnOnce
์ ํ์ํ์
์
๋๋ค. Fn
์ FnMut
๊ณผ FnOnce
์ ํ์ ํ์
์
๋๋ค. ์ฆ, FnMut
๋ FnOnce
๊ฐ ํธ์ถ๋๋ ๊ณณ์ด๋ฉด ์ด๋์๋ ์ฌ์ฉ ํ ์ ์๊ณ Fn
์ FnMut
์ FnOnce
๊ฐ ํธ์ถ๋๋ ๊ณณ์ด๋ฉด ์ด๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ๋ ํด๋ก์ ๊ฐ ๋ฌด์์ ์บก์ณํ๋์ง์ ๋ฐ๋ผ Copy
(์๋ฅผ ๋ค์ด add_3
)๊ณผ Clone
(์๋ฅผ ๋ค์ด multiply_sum
)์ ์์์ ์ถ๋ก ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ก์ ธ๋, ๊ฐ๋ฅํ๋ค๋ฉด, ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์บก์ณ๋ฅผ ํฉ๋๋ค. move
ํค์๋๋ฅผ ์ฐ๋ฉด ๊ฐ์ผ๋ก ์บก์ณ๊ฐ ๋ฉ๋๋ค.
fn make_greeter(prefix: String) -> impl Fn(&str) { return move |name| println!("{} {}", prefix, name) } fn main() { let hi = make_greeter("Hi".to_string()); hi("there"); }