함수

함수 에서 Rust

1개의 연습 문제

함수 소개

함수는 하나 이상의 문 또는 표현식을 담고 있는 코드 본문이에요. 함수는 선택적으로 값을 반환할 수 있어요.

Rust에서는 함수 이름에 스네이크 케이스를 사용하고, 함수 정의 앞에는 fn 키워드를 붙여요. 예를 들어,

fn do_nothing() {}

괄호 안에는 쉼표로 구분된 0개 이상의 매개변수가 들어가요. 매개변수는 함수에 전달되는 특정 타입의 값에 대한 바인딩이에요. 매개변수가 하나도 없더라도 함수 정의에는 괄호가 반드시 필요해요. 매개변수에 실제로 전달되는 값을 인자라고 해요.

매개변수와 반환값을 합쳐서 함수의 시그니처라고 해요. 함수의 시그니처에서는 각 매개변수에 타입을 명시해야 해요.

중괄호는 함수의 본문, 즉 문과 표현식을 감싸요. 함수에 문이나 표현식이 하나도 없더라도 함수 정의에는 중괄호가 반드시 필요해요.

다음 예제에서 함수는 i32 타입의 매개변수 하나를 받아서 value라는 이름에 바인딩하고, 이를 출력해요.

fn print_integer(value: i32) {
    println!("{value:?}");
}

매개변수가 정의된 모습을 눈여겨봐요. 각 매개변수는 name: Type 형식으로 정의해요.

함수는 값을 반환할 수도 있어요. 기본적으로 마지막 표현식의 결과가 반환돼요. 다음 예제에서 함수는 i32 매개변수 하나를 갖고, 그 값의 두 배를 반환해요.

fn double_integer(value: i32) -> i32 {
    value * 2
}

-> i32는 함수가 i32를 반환한다는 것을 나타내요. 매개변수와 달리 반환되는 값에는 이름이 없어요.

return 키워드를 사용하면 함수에서 일찍 빠져나올 수 있어요. 다음과 같이요:

fn long_function() -> i32 {
    let some_condition = false;
    // code snipped
    if (some_condition) {
        return 0;
    }
    // more code snipped
    42
}

const fn은 컴파일 시간에 평가될 수 있는 상수 함수를 정의할 때 사용해요.

const fn compute_data_checksum() -> u128 {
  const DATA: &[u8] = include_bytes!("my_big_data_file");
  // checksum implementation is left as an exercise for the reader
}

/// This checksum is used to validate that the user has not tampered with proprietary configuration.
pub const DATA_CHECKSUM: u128 = compute_data_checksum();

상수 함수는 컴파일 시간에 평가될 수 있기 때문에, 일반 함수에는 없는 몇 가지 제약이 있어요. 특히 const fn은 const로 표시된 다른 함수만 호출할 수 있어요. 이 제약을 지키지 않으면 컴파일 오류가 발생해요.

const fn multiply_integer(value: i32) -> i32 {
    use std::time::SystemTime;
    if SystemTime::now().elapsed().unwrap().as_nanos() == 0 { // this line errors
        value * 2
    } else {
        value * 3
    }
}

익명 함수도 있는데, 이는 closures 주제에서 다뤄요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요