1. 함수 포인터



타입명에 fn 키워드가 들어갔으면 모두 함수 포인터인데 시그니쳐는 물론 unsafe나 extern등의 키워드에 따라 다른 타입취급을함


그래서 크기별로 impl해주는 배열처럼 fn들도 impl을 시그니쳐별로 다 만들어줘야함








unsafe는 함수 호출이 unsafe 하다는거고


extern은 외부 abi를 사용해 호출한다는 뜻임 디폴트는 extern "Rust"고 extern "C"는 C abi라는식




2. Fn trait



Rust에는 함수를 나타내는 3가지 trait가 있음


Fn FnOnce FnMut인데 차이점은 call 함수가 &self냐 self냐 &mut self냐인데


그래서 FnOnce는 루프에서 못쓴다던가 Fn에는 &mut를 넣어도 먹통이라던가 몇몇 차이가 있는데 왠만하면 FnMut를 쓰게될거임


trait라서 !Sized 타입이므로 매개변수에 바로 넣는다던가 하는건 안됨 제네릭 쓰던가 박싱하던가 &dyn를 쓰도록 하자




3. 클로저



| 매개변수 | 함수본문


이 형태로 구성됨 expression만 있으면 돼서 {}를 안쓰고

let foo = || 0; 같이 쓰는것도 가능함



익명타입을 만들어서 Fn들을 구현시킴


말그대로 익명이라 스코프를 벗어나서 쓰려면 trait의 형태로 전달해야함




클로저에서 레퍼런스를 캡쳐해버리면 클로저 객체의 수명에 묶여버리므로 조심해서 써야함






특히 &mut는 조심해서 쓰자



또 || 앞에 move를 붙이면 변수를 레퍼런스로 캡쳐하는대신 아얘 이동을 시켜버림





이렇게 Copy trait들은 복사되지만 Arc같은 타입들은 move로 넘기기전에 clone시켜야 원본도 계속 쓸수있음