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