Closure Contract

클로저 타입은 캡처한 값을 어떻게 쓰는지로 좁혀진다

`move` 키워드보다 중요한 질문은 본문이 값을 읽기만 하는지, 바꾸는지, 밖으로 이동시키는지입니다.

1

읽기만 한다

환경 값을 불변 참조로 캡처하므로 여러 번 호출하고 다른 읽기와도 함께 둘 수 있습니다.

Fn
2

값을 바꾼다

가변 참조를 캡처하므로 호출 전후의 빌림 경계를 더 좁게 봐야 합니다.

FnMut
3

밖으로 이동한다

캡처한 값을 소비하면 같은 클로저를 다시 호출할 수 없어서 한 번 호출 계약이 됩니다.

FnOnce

`unwrap_or_else``None`일 때 최대 한 번만 호출하므로 가장 넓게 `FnOnce`를 받을 수 있습니다.

`sort_by_key`원소마다 여러 번 호출하므로 값 소비는 막는 `FnMut`이 필요합니다.

콜백 API동시에 여러 번 읽어도 되는 콜백이면 `Fn`이 호출자에게 가장 예측 가능합니다.