환경 캡처하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 62번째.
클로저의 가장 강력한 특징 중 하나는 주변 환경의 변수를 캡처하고 사용할 수 있는 능력입니다. 일반적인 함수와 달리, 클로저는 자신이 정의된 것과 동일한 스코프에 존재하는 변수를 "보고" 접근할 수 있습니다.
환경 캡처가 작동하는 방식은 다음과 같습니다:
fn main() {
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // 이것은 "The value of x is: 10"을 출력합니다
}이 예제에서 클로저는 주변 스코프에서 변수 x를 캡처하여 본문 내부에서 사용합니다. 클로저는 x를 매개변수로 전달받을 필요가 없으며, 자동으로 해당 변수에 접근할 수 있습니다.
변수를 캡처하여 계산에 사용할 수도 있습니다:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // 결과는 15입니다챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 기본 가격을 나타내는 숫자입니다. 두 번째 입력은 할인율을 나타내는 숫자입니다. 환경에서 할인율을 캡처하여 할인을 적용한 후의 최종 가격을 계산하는 클로저를 만드세요. 기본 가격을 인수로 하여 클로저를 호출하고 최종 가격을 출력하세요.
요구 사항:
- 첫 번째 입력(기본 가격)을 읽고 공백을 제거합니다.
- 이를
f64타입으로 파싱합니다. - 두 번째 입력(할인율)을 읽고 공백을 제거합니다.
- 이를
f64타입으로 파싱합니다. - 하나의 매개변수(기본 가격)를 받고 주변 환경에서 할인율을 캡처하는 클로저를 만듭니다.
- 클로저는 다음 공식을 사용하여 최종 가격을 계산해야 합니다:
base_price - (base_price * discount / 100.0) - 기본 가격을 사용하여 클로저를 호출합니다.
- 최종 가격을 출력합니다.
입력:
- 첫 번째 줄: 기본 가격 (예:
100.0) - 두 번째 줄: 할인율 (예:
20.0)
출력:
- 할인이 적용된 후의 최종 가격
치트 시트
클로저는 매개변수로 필요하지 않더라도 주변 환경의 변수를 캡처하고 사용할 수 있습니다.
기본 환경 캡처:
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // Prints "The value of x is: 10"계산에서 변수 캡처:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result is 15클로저는 주변 스코프에서 multiplier를 자동으로 캡처하여 계산에 사용합니다.
직접 해보기
use std::io;
fn main() {
// 기본 가격 읽기
let mut base_price_input = String::new();
io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
// 할인율 읽기
let mut discount_input = String::new();
io::stdin().read_line(&mut discount_input).expect("Failed to read line");
let discount: f64 = discount_input.trim().parse().expect("Invalid number");
// TODO: 할인을 캡처하고 최종 가격을 계산하는 클로저 생성
// TODO: 기본 가격으로 클로저 호출
// 최종 가격 출력
// println!("{}", final_price);
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.