작성
·
65
1
fn main() {
let s: String = String::from("헬로");
let (s, len) = string_length(s);
println!("문자열 {}의 길이는 {}", s, len);
}
fn string_length(s: String) -> (String, usize) {
(s, s.len())
}
string_length 함수에서 선생님께서 쓰신 코드와 순서를 바꿔 입력하였을때 오류가 발생합니다.
선생님: (s.len(), s)
저 :(s, s.len())
물론 메인함수의 (s, len) 순서도 수정하였으며, string_length 함수의 반환타입도 순서도 수정하였습니다.
답변 1
1
수강 및 예리한 질문 감사드립니다.
실험해보신 내용처럼 (s, s.len())
으로 응답 튜플의 순서를 바꾸었을 때, 아래와 같은 컴파일 오류가 발생하는 것을 확인하였습니다.
에러의 내용은, 튜플의 첫번째 요소로써, s
를 반환하기로 했기 때문에, 이 시점에 이미 소유권 반납이 이뤄졌다고 보는 거라고 이해하면 될 것 같습니다. 이미 소유권이 반납된 s
를 이용해서 .len()
메소드를 호출하려 할 때의 상황입니다.
이 문제를 해결하려면, len을 미리 값을 구해두면 되겠습니다.
fn main() {
let s: String = String::from("헬로");
let (s, len) = string_length(s);
println!("문자열 {}의 길이는 {}", s, len);
}
fn string_length(s: String) -> (String, usize) {
let len = s.len();
(s, len)
}
괜한 번거로움이니, 원래대로 usize를 앞에 담은 튜플을 반환하는 것이 편하겠고, 더 나아가 이후 강의에 설명드리는 임대 개념을 사용하면 좋을 것 같습니다.
우선 이 질문과 답변의 핵심은, 소유권의 이동 시점에 관한 것이겠습니다.
감사합니다.