함수와 클로저

함수

필요에 따라 expression으로 끝나는 statement의 나열로 구성된 함수 바디를 가짐

함수는 구문으로 정의되며 반환값을 갖는 함수는 호출될 때 바디 블록이 결과값을 반환

함수의 타입

컴파일러 내부에서 사용하는 타입

main.rs에 sum함수가 있다면 이 함수의 타입은 "fn(i32, i32) -> i32 {main::sum}"

코드에서 이런 함수 타입을 직접 사용할 수는 없지만 함수포인터는 사용 가능

let p_sum: fn(i32, i32) -> i32 = sum; 에서 sum을 가리키기위한 함수 포인터의 타입은 "fn(i32, i32) -> i32

클로저

변수에 저장하거나 다른 함수에 인수로 전달될 수 있는 익명 함수로, 함수 내부에서 외부 변수를 조작

|파라미터|리턴값

함수 트레이트

러스트에서는 함수 포인터 말고도 트레이트를 이용해 함수를 변수에 담아 다룰 수 있는데 함수 포인터와의 차이는 클로저도 담을 수 있다는 것

외부 환경을 참조하는 클로저는 함수 트레이트 타입 변수에만 담아짐

함수 트레이트의 종류를 구분하는 방법은 호출 가능한 횟수와 외부환경 변경가능성

FnOnce: 최소 한 번은 호출 가능(소유권을 소비하는 함수도 가능한 가장 관대한 조건)

FnMut: 여러번 호출 가능, 외부 환경을 수정 가능(여기에 할당 가능한 함수들은 FnOnce 변수에도 할당 가능)

Fn: 여러번 호출 가능, 외부환경 수정 불가(가장 좁은 조건, 때문에 여기에 할당가능한 함수들은 위 두 경우에도 할당가능)

내가 가진 클로저가... FnOnce 자리에 FnMut 자리에 Fn 자리에
Fn (읽기 전용) ✅ 가능 ✅ 가능 ✅ 가능
FnMut (수정 가능) ✅ 가능 ✅ 가능 ❌ 불가능
FnOnce (소유권 이동) ✅ 가능 ❌ 불가능 ❌ 불가능