Rust에서 모든 호출 가능한 타입은 Fn, FnMut, FnOnce중 하나를 구현한다
셋의 차이첨은 그 객체를 호출할때 어느 소유권이 필요한가의 차이고 앞의것을 구현했다면 뒤의것은 자동으로 구현된다
ex) Fn을 구현했다면 자동으로 FnMut와 FnOnce도 구현한다
얘네는 설탕을 잔뜩 먹어서 제네릭에 꺽쇠를 쓰지 않고 특유의 시그니쳐를 갖는다
함수와 함수포인터 그리고 클로저가 보통 볼수있는 호출 가능한 타입인데 함수랑 함수포인터는 캡쳐를 하지 않으니 그냥 Fn을 구현해버린다
다만 클로저는 외부변수를 수정하면 Fn을 구현할수 없고 외부변수를 이동시키면 FnOnce만을 구현한다
그래서 클로저를 쓸때는 항상 뭘 어떤식으로 캡쳐할지 좀 신경써줘야한다
오랜만에 러스트 글이네. ㅊㅊ