[Rust] Closure
2. Closure
closure는 익명함수입니다.
그래서 이름이 없습니다. 대신 다른 것은 함수와 비슷합니다.
단 파라미터를 선언하는 부분만 약간 다릅니다.
(파라미터) 대신 |파라미터|를 사용합니다.
let 클로저 이름 = |파라미터|{...}
클로저는 이름이 없다더니 클로저의 이름아라니? 이상합니다.
하지만 클로저 선언부에는 ‘fn’ 키워드도 없고, 클러저 이름도 없습니다.
다만 익명으로 선언된 후에 변수처럼 할당해 주는 것입니다.
당연히, 이렇게 변수에 할당하지 않고 익명 함수를 그대로 사용할 수 있습니다.
/// 10을 더하는 함수
fn add10(n: i32) -> i32 {
return n + 10;
}
/// 문자엻을 출력하는 함수
fn show_this(s: String) {
println!("{}", s);
}
fn main() {
// 함수 사용
let mut x = add10(5);
show_this(x.to_string());
// 클로저 사용
let mut add10_closure = |x:i32|{x + 10};
show_this(add10_closure(5).to_string());
}
// 출력
15
15
위의 코드를 보면 add10 함수와 동일한 기능을 하는 클로저를 선언했습니다.
let mut add10_closure = |x:i32|{x + 10};
파라미터로 i32 타입의 x를 받고 여기에 10을 더해 반환합니다. 클로저 바디의 유일한 코드이자 마지막 라인인 “x + 10”에 “;”이 없습니다. 그래서 “x + 10”이 반환값이 됩니다.
이렇게 선언된 익명 함수를 add10_closure라는 이름의 변수에 할당합니다.
만약 변수에 할당하고 싶지 않다면 다음과 같이 바로 show_this 함수의 인자로 사용해도 됩니다.
show_this((|x:i32|{x + 10})(10).to_string());
클로저를 선언하고 괄호로 묶은 뒤, 마치 함수를 사용 하듯이 파라미터값으로 (10)을 지정했습니다. 그리고 그 결과 값을 to_string 메소드로 문자열로 바꿨습니다.
클로저도 함수이기 때문에 함수를 파라미터로 받는 함수의 파라미터로 사용할 수 있습니다.
Rust의 함수와 클로저는 일급객체입니다.
일급객체는 함수의 파라미터나 반환값으로 사용할 수 있다는 의미입니다.
// 함수를 파라미터로 받는 함수
fn show_closure(f: fn(i32) -> i32, n:i32){
println!("{}", f(n).to_string())
}
fn main(){
show_closure(|x:i32|{x+100}, 10);
}
// 출력
110
show_closure 함수는, i32 타입을 파라미터로 받아서 i32 타입을 반환하는 어떤 함수 f 를 파라미터로 받습니다. 파라미터 함수 f의 타입을 선언하는 f: fn(i32) -> i32 부분을 눈여겨 봐 두십시오.
또 showclosure 함수는 i32 타입인 n도 함께 파라미터로 받습니다.
함수 선언부에서는 그냥 단순하게 함수 f의 반환값을 문자열로 변환하고 출력합니다. 그래서 show_closure 함수는 반환값 타입이 선언되어 있지 않습니다.
위 코드와 동일한 클로저를 변수에 할당해서 파라미터로 입력해 보겠습니다. 기능과 출력값 모두 같습니다.
let mut f = |x:i32|{x+100};
show_closure(f, 10);
// 출력
110