Menu
Coddy logo textTech

환경 캡처하기

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입니다
challenge icon

챌린지

쉬움

두 개의 입력을 받게 됩니다. 첫 번째 입력은 기본 가격을 나타내는 숫자입니다. 두 번째 입력은 할인율을 나타내는 숫자입니다. 환경에서 할인율을 캡처하여 할인을 적용한 후의 최종 가격을 계산하는 클로저를 만드세요. 기본 가격을 인수로 하여 클로저를 호출하고 최종 가격을 출력하세요.

요구 사항:

  • 첫 번째 입력(기본 가격)을 읽고 공백을 제거합니다.
  • 이를 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);
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨