Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

함수

생략을 무시하고, 라이프타임을 가진 함수 시그니처에는 몇 가지 제약 사항이 있습니다:

  • 모든 참조는 반드시 어노테이션된 라이프타임을 가져야 합니다.
  • 반환되는 모든 참조는 입력과 동일한 라이프타임을 가지거나 static이어야 합니다.

또한, 입력 없이 참조를 반환하는 것이 유효하지 않은 데이터에 대한 참조를 반환하는 결과를 낳는다면 금지된다는 점에 유의하세요. 다음 예제는 라이프타임이 있는 유효한 함수 형태를 보여줍니다:

// 라이프타임 `'a`를 가진 하나의 입력 참조입니다.
// 이 참조는 적어도 함수만큼 오래 살아야 합니다.
fn print_one<'a>(x: &'a i32) {
    println!("`print_one`: x는 {}입니다", x);
}

// 가변 참조도 라이프타임과 함께 사용할 수 있습니다.
fn add_one<'a>(x: &'a mut i32) {
    *x += 1;
}

// 서로 다른 라이프타임을 가진 여러 요소들입니다. 이 경우,
// 둘 다 동일한 라이프타임 `'a`를 가져도 괜찮지만,
// 더 복잡한 경우에는 서로 다른 라이프타임이 필요할 수 있습니다.
fn print_multi<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("`print_multi`: x는 {}, y는 {}입니다", x, y);
}

// 전달된 참조를 반환하는 것은 허용됩니다.
// 하지만, 올바른 라이프타임이 반환되어야 합니다.
fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a String { &String::from("foo") }
// 위 코드는 유효하지 않습니다: `'a`는 함수보다 오래 살아야 합니다.
// 여기서 `&String::from("foo")`는 `String`을 생성한 후 참조를 생성합니다.
// 그런 다음 스코프를 벗어날 때 데이터가 드롭되어,
// 유효하지 않은 데이터에 대한 참조가 반환됩니다.

fn main() {
    let x = 7;
    let y = 9;

    print_one(&x);
    print_multi(&x, &y);

    let z = pass_x(&x, &y);
    print_one(z);

    let mut t = 3;
    add_one(&mut t);
    print_one(&t);
}

참고:

함수