ํด๋ก์ (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"); }