공유 대여는 읽되 소유권을 옮기지 않는다

&s1String을 넘기는 대신 그 값을 가리키는 참조자를 만든다. 함수는 빌려 읽고, 소유자는 호출 뒤에도 값을 계속 쓴다.

1

호출 전 · 소유

let s1 = String::from("hello");

s1이 힙의 문자열을 소유한다. 이 값을 그대로 함수에 넘기면 소유권도 이동한다.

2

호출 중 · 대여

calculate_length(&s1)
s: &String → s.len()

매개변수 s는 유효한 String을 가리켜 길이를 읽지만, 데이터를 소유하지 않는다.

3

호출 후 · 계속 유효

let len: usize = …;
println!("{s1}: {len}");

함수의 참조자 s만 스코프를 벗어난다. 소유권은 처음부터 s1에 남아 있어 반환받을 필요가 없다.

기호 읽기 &는 참조자를 만들고, *는 참조자가 가리키는 값을 역참조한다. Rust 참조자는 살아 있는 동안 유효한 타입의 값을 가리키도록 검사된다.