320x100
320x100
함수 포인터 (function pointer)
일반 함수를 함수에 전달할 수 있도록 해주는 기법
새로운 클로저를 정의하는 대신 이미 정의한 함수를 전달하고 싶을 때 유용
함수는 fn 타입으로 강제되는데 이 fn 타입을 함수 포인터라고함 (Fn 클로저 트레이트와 혼동 주의)
함수 포인터로 함수를 전달하면 함수를 다른 함수에 대한 인수로 사용할 수 있음
fn add_one(x: i32) -> i32 {
x + 1
}
// fn 타입 (함수 포인터) 사용
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
f(arg) + f(arg)
}
fn main() {
let answer = do_twice(add_one, 5);
println!("answer: {}", answer);
}
함수 포인터는 세 가지 클로저 트레이트 (Fn, FnMut, FnOnce)를 모두 구현하므로, 클로저를 기대하는 함수에 대한 인수로 함수 포인터를 언제나 전달할 수 있음
제네릭 타입과 클로저 트레이트 중 하나를 사용하는 함수를 작성하여 함수나 클로저 중 하나를 받아들일 수 있도록 하는 것이 가장 좋음
클로저 반환하기
클로저는 트레이트로 표현되므로, 클로저를 직접 반환할 수 없음
트레이트를 반환해야하는 대부분의 경우, 대신 트레이트를 구현하는 구체적 타입을 함수의 반환값으로 사용할 수 있음
그러나 클로저에는 반환 할 수 있는 구체적 타입이 없기 때문에 그렇게 할 수 없음
러스트가 클로저를 저장하기 위해 얼마나 많은 공간이 필요한지 알 수 없기 때문임
때문에 트레이트 객체를 사용하면 클로저를 반환할 수 있음
fn return_closure() -> Box<dyn Fn(i32) -> i32> {
Box::new(|x| x + 1)
}
300x250
728x90
'Programming > Rust' 카테고리의 다른 글
러스트의 유용한 도구들 (0) | 2025.10.12 |
---|---|
러스트 매크로 (0) | 2025.10.12 |
러스트 고급 타입 (0) | 2025.10.12 |
러스트 고급 트레이트 (0) | 2025.10.12 |
안전하지 않은 러스트 (0) | 2025.10.12 |