함수 호출에서의 수명

함수는 인수를 빌리는 것 외에도 빌린 값을 반환할 수 있습니다:

#[derive(Debug)]
struct Point(i32, i32);

fn left_most<'a>(p1: &'a Point, p2: &'a Point) -> &'a Point {
    if p1.0 < p2.0 { p1 } else { p2 }
}

fn main() {
    let p1: Point = Point(10, 10);
    let p2: Point = Point(20, 20);
    let p3: &Point = left_most(&p1, &p2);
    println!("left-most point: {:?}", p3);
}
  • 'a는 제네릭 매개변수로 컴파일러로에 의해 추론됩니다.
  • 수명의 이름은 ' 로 시작하며 보통 'a를 많이 씁니다.
  • &'a PointPoint의 수명이 최소한 'a라는 수명보다는 같거나 더 길다는 것을 의미합니다.
    • 매개변수들이 서로 다른 스코프에 있을 경우 “최소한“이라는 조건이 중요합니다.

위의 예시에서 다음을 시도해 보시기 바랍니다:

  • p2p3를 새로운 범위({...})로 아래 코드와 같이 이동해 봅니다:

    #[derive(Debug)]
    struct Point(i32, i32);
    
    fn left_most<'a>(p1: &'a Point, p2: &'a Point) -> &'a Point {
        if p1.0 < p2.0 { p1 } else { p2 }
    }
    
    fn main() {
        let p1: Point = Point(10, 10);
        let p3: &Point;
        {
            let p2: Point = Point(20, 20);
            p3 = left_most(&p1, &p2);
        }
        println!("left-most point: {:?}", p3);
    }

    p3의 수명이 p2 보다 길기 때문에 이 예제는 컴파일되지 않음을 확인하시기 바랍니다.

  • 작업공간을 초기화 한 후 함수 시그니처를 fn left_most<'a, 'b>(p1: &'a Point, p2: &'a Point) -> &'b Point로 변경해 봅니다. 이 경우 'a'b사이의 관계가 불분명하기 때문에 컴파일 되지 않습니다.

  • 이 에러를 설명하는 또 다른 방법은 다음과 같습니다:

    • 이 함수는 두 값을 빌려서, 새로운 참조를 반환합니다.
    • 이 반환된 참조는 두 입력 중 하나로 부터 와야 합니다. (아니면 전역 변수로 부터)
    • 두 입력 중 어떤 것일까요? 컴파일러는 이를 알아야 합니다. 그래야만 함수 호출부에서 봤을 때, 반환된 참조의 수명이 원래 값을 수명보다 길지 않음을 확인할 수 있기 때문입니다.