[Rust] 콜백함수와 클로저

코드를 짜다 보면 함수에 다른 함수를 인자로 전달해야 할 경우가 빈번하다.

그리고 함수도 변수처럼 다룰 수가 있다.

이렇게 image

image 함수의 타입은

fn(파라미터타입들...) -> 리턴타입으로 표현된다.

이것을 응용해서 배열과 함수를 받아서 순차접근을 하는 for_each 구문을 구현해볼수 있다.


image

image 제너릭도 적용 안해서 제대로 된 for_each라고 보기는 어렵지만 어쨌든 된다.

그런데 저기서 콜백함수를 전달하긴 하지만... 뭔가 흐름을 파악하기 불편한 점이 있다.

이럴때는 함수를 따로 만들어서 전달하는 것보다는 클로저라는 이름없는 함수를 즉석에서 생성해서 보내는 것이 편하다.

클로저는 이런 형태를 지닌다.
|파라미터...| -> 반환타입 {몸통...}


image

image 클로저도 위처럼 let에 바인딩을 할수 있긴 한데, 함수와는 작동방식이 달라서 타입표기방법이 다르다.

클로저를 파라미터로 받거나 리턴할 때는 타입을 명시해서 받을 수 있는데,
let에 바인딩할 때는 아예 안되는건지 내가 못찾은건지 모르겠다.
아마 클로저는 명확한 타입 명시가 불가능한 것 같다.

어쨌든 실제로 써먹을때는 제너릭이나 타입추론에 맡기면 되므로 이런걸 신경쓸일은 별로 없겠다.

파라미터로 전달할 때는
impl Fn(파라미터타입) -> 반환타입...
으로 타입을 명시할 수 있다.
클로저가 Fn 트레잇을 구현하기 때문에 가능하다.


image

image 여기서 사용한 impl trait 기능은 아주 최근에 추가된 문법이라서 웹컴파일러에서는 안 돈다.

제너릭을 쓰자.