closure bounds

콜백 API는 호출 방식에서 바운드가 정해집니다

클로저를 인수로 받는 함수는 가장 약한 요구부터 고릅니다. 호출 횟수, 내부 변경, 값 소비 여부를 순서대로 보면 됩니다.

where F: FnOnce() -> T
FnMut(Item)
Fn(&Item) -> bool
1 FnOnce

한 번만 부르나요?

기본값 생성, 지연 계산, 소유한 값을 결과로 꺼내는 콜백인가요?

예라면 FnOnce가 충분합니다. 모든 클로저가 최소 한 번은 호출될 수 있기 때문입니다.

2 FnMut

반복 호출 중 상태를 바꾸나요?

카운터 증가, 버퍼 누적처럼 캡처한 값을 수정해야 하나요?

예라면 FnMut을 받습니다. 여러 번 호출하되 내부 상태를 바꿀 수 있어야 합니다.

3 Fn

읽기 전용으로 충분한가요?

필터 조건이나 비교 함수처럼 환경을 읽기만 하고 재사용하나요?

예라면 Fn이 가장 좁고 유연합니다. 공유 참조로 여러 곳에서 반복 호출하기 쉽습니다.

A
요구를 낮게 잡을수록 받는 클로저가 많아집니다. 한 번만 호출하는 API가 굳이 Fn을 요구하면 유용한 클로저를 거절할 수 있습니다.
B
move는 캡처 위치를 바꾸지만 호출 가능 횟수를 직접 정하지 않습니다. 본문이 값을 소비하는지, 변경하는지, 읽기만 하는지가 최종 트레이트를 결정합니다.