13.4.2 Functions

생략elision을 제외하면, 생명주기를 갖는 함수 선언은 몇 가지 제약이 있다:

  • 모든 참조는 반드시 생명주기 주해를 소지해야 한다.
  • 반환되는 모든 참조는 반드시 입력 인자 혹은 static과 동일한 생명주기를 가져야 한다.

추가로 주목할 사항은 인자 없는 참조 반환은 유효하지 않은 데이터의 참조를 결과로 반환하는 경우 금지된다. 다음 예제는 생명주기와 함께 함수를 사용하는 유효한 형식을 보여준다: Additionally, note that returning references without input is banned if it would result in returning references to invalid data. The following example shows off some valid forms of functions with lifetimes:

// 생명주기 `'a`인 한 입력 참조는 반드시
// 최소 함수만큼 유지되어야 한다.
fn print_one<'a>(x: &'a i32) {
    println!("`print_one`: x is {}", 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 is {}, y is {}", x, y);
}

// 전달된 참조의 반환은 허용된다.
fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a i32 { &7 }
// 위는 유효하지 않다. `'a`는 함수보다 반드시 오래 유지되어야 한다.
// 여기서 `&7`은 참조가 붙는 `i32`를 생성하고
// 이후 범위를 벗어나면서 데이터가 삭제되어
// 유효하지 않은 데이터의 참조가 반환되게 된다.

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);
}

See also:

functions

results matching ""

    No results matching ""