클로저는 바깥쪽 함수에 속한 데이터를 사용할 수 있다. 이것을 변수 캡처라고 말한다. 클로저를 사용할때는 ||기호를 붙인다. ||기호안에는 쓰고싶은 단어를 자유롭게 넣을수 있다 예를들어 |city|, |monster| 이렇게
eg) 1. City 스트럭트에 있는 변수 monster_attacks_risk: f64타입을 외부에서 사용하고 싶다
struct City {
name: String,
population: i64,
country: String,
monster_attacks_risk: f64,
}
struct Preference {
acceptable_monster_risk: f64,
}
2. fn타입은 함수만 받을 수 있는데 Fn트레이드를 사용하면 외부에서 함수와 클로저를 모두 받을 수 있다.
fn count_selected_cities<F>(cities: &Vec<City>, test_fn: F) -> usize
// count_selected_cities함수 타입을 제네릭으로 수정해서 test_fn인수에 임의의 타입 F를 받는다.
where
// Fn트레이드를 사용해서 함수와 클로저를 외부에 있는 다른 함수에서 사용할 수 있다.
F: Fn(&City) -> bool,
{
let mut count = 0;
for city in cities {
if test_fn(city) {
count += 1;
}
}
count
}
3. main함수에 앞에서 본 Fn 트레이드를 사용한 외부함수인 count_selected_cities함수와 함수에 속한 |city| 클로저로 모두 불러올 수 있다.
fn main() {
let my_cities = vec![
City {
name: "New York".to_string(),
population: 8000000,
country: "USA".to_string(),
monster_attacks_risk: 0.2,
},
City {
name: "Tokyo".to_string(),
population: 9000000,
country: "Japan".to_string(),
monster_attacks_risk: 0.1,
},
];
let preference = Preference {acceptable_monster_risk: 0.1};
let limit = preference.acceptable_monster_risk;
// 외부에 있는 count_selected_cities함수와 |city|클로저를 받아왔다.
let n = count_selected_cities(&my_cities, |city| city.monster_attacks_risk > limit);
}
1.fn 타입 (함수만 받는다)
fn(&City) -> bool
2. Fn 트레이트 (함수와 클로저를 모두 받는다)
Fn(&City) -> bool
https://www.yes24.com/Product/Goods/116789691
'Rust' 카테고리의 다른 글
Rust Mutex 스레드 (0) | 2024.01.27 |
---|---|
자바스크립트 러스트 클로저 비교, 메모리관리 (0) | 2024.01.26 |
러스트 impl 트레이트 반환타입 (0) | 2024.01.16 |
러스트 제네릭 스트럭트 (0) | 2024.01.15 |
러스트 모듈(pub mod) (0) | 2024.01.09 |