강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của saintheaven78290
saintheaven78290

câu hỏi đã được viết

Giới thiệu và sử dụng Rust, một ngôn ngữ lập trình tinh tế, hiệu suất cao

메모리 관리규칙에서 질문드립니다.

Đã giải quyết

Viết

·

188

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 함수의 반환타입도 순서도 수정하였습니다.

rustwebassembly

Câu trả lời 1

1

hatemogi님의 프로필 이미지
hatemogi
Người chia sẻ kiến thức

수강 및 예리한 질문 감사드립니다.

실험해보신 내용처럼 (s, s.len())으로 응답 튜플의 순서를 바꾸었을 때, 아래와 같은 컴파일 오류가 발생하는 것을 확인하였습니다.

 

Screenshot 2024-08-13 at 5.46.52 PM.png

 

에러의 내용은, 튜플의 첫번째 요소로써, 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를 앞에 담은 튜플을 반환하는 것이 편하겠고, 더 나아가 이후 강의에 설명드리는 임대 개념을 사용하면 좋을 것 같습니다.

우선 이 질문과 답변의 핵심은, 소유권의 이동 시점에 관한 것이겠습니다.

 

감사합니다.

 

Hình ảnh hồ sơ của saintheaven78290
saintheaven78290

câu hỏi đã được viết

Đặt câu hỏi