강의

멘토링

커뮤니티

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

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

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

Tuổi thọ giá trị cho thuê (cập nhật 23/10)

Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문

Đã giải quyết

Viết

·

257

0

강의 내용에서는 어떤 값이 길지 컴파일러가 예측하지 못하기 때문에 라이프사이클을 명시해야한다고 했는데 이 부분이 이해가 되지 않습니다로컬변수를 리턴하려고 하는 게 문제가 되는게 아닌가요?
rustwebassembly

Câu trả lời 1

1

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

예리한 질문 감사드립니다. 네, 아무래도 소유권과 임대, 그리고 생명주기(라이프사이클)등이 좀 생소하기 때문에 설명과 이해가 어려운 것 같습니다. 아마 아래 예제에 대한 질문이신 것 같습니다.

 

fn str_lifetime() {
    let s1 = String::from("가나다");
    let s2 = "하나둘셋";

    let res = longest(s1.as_str(), s2);
    println!("더 긴 문자열은 {}", res);
}
/* 수명 표기를 잘 한 경우 */
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() > s2.len() {
        s1
    } else {
        s2
    }
}

러스트의 함수에서 로컬 변수값을 리턴하는 것은 문제가 되지 않습니다. 로컬 변수에 대한 소유권이 함수 안에 있다했을 때, 반환값으로 넘어가면 해당 소유권이 함수 호출자에게로 이전되고, 호출한 입장에서는 해당 반환값을 문제없이 잘 활용할 수 있습니다.

게다가 소유권 "임대"의 경우에는 애초에 나한테 있던 소유권이 아니라 빌려왔던 것이기 때문에, 외부의 참조값을 빌려온 함수 입장에서는 애초에 내 소유가 아닙니다. 반환을 하든 안하든 애초에 내 소유가 아니었기 때문에 소유권 고민 문제에서 자유롭게 됩니다.

 

해당 라이프사이클에 대한 설명은, 소유권 임대의 상황에서, 그 임대값 참조의 수명을 명시해야 할 필요가 있는 경우에 대한 것인데요, 강의 중에 설명을 한 내용입니다만, 여기 글로 다시 정리해보겠습니다.

longest함수에서 s1s2라는 문자열슬라이스, 그러니까 참조값을 임대해 와서 무언가를 하고 있습니다. 코드 안에서는 s1s2len()함수를 써서 길이를 판단해보고, 더 긴 참조값을 반환했습니다. 러스트 컴파일러 입장에서는 런타임에서 달라질 수 있는 (사실 이 코드에서는 s1과 s2의 구체적인 값이 하드코딩되어있기 때문에 어쩌면 알 수도 있겠습니다만, 일반적으로 문자열 값은 런타임에 다른 값이 발생하겠죠) 문자열들의 길이를 미리 알 수가 없습니다. 그러니 s1참조값과 s2참조값 중 어느 것이 반환될지 모르는 상황입니다.

이럴 때, 러스트 프로그래머가 둘 중 어느것이든 반환 될 수 있고, 그 라이프사이클이 반환값의 라이프사이클 조건과 맞을 수 있도록 명시해주는 작업인 거죠.

그렇게 컴파일러의 임대 검사기 (borrow checker)가 'a라는 동일 lifecycle 기준으로 검사를 진행할 수 있게 해주는 상황입니다.

다시 글로 적어도 어려운 내용인 것 같습니다. 추가 설명드리면 좋을 부분 있으시면 편히 말씀 부탁드립니다.

 

수강해주시고, 질문 남겨주셔서 감사합니다.

 

16326916857님의 프로필 이미지
16326916857
Người đặt câu hỏi

상세한 답변 감사드립니다. 강사님이 말씀해주신 사항으로 잘 이해가 됐습니다.

강의 중반부까지만 듣고 질문을 드렸었는데, 후반부에 더 자세히 설명해 주시더라고요 ㅎㅎ;

라이프사이클 관련 강의를 수강한 뒤에 같은 코드를 c++로 작성했을 때 차이를 비교해보면서 이해해 보려고 했는데, c++과 러스트로 작성한 코드를 비교해 생각해 봤을 때도 잘이해가 되지 않았습니다. 자세히 답변을 달아주신 덕분에 외부 참조에 대한 소유권 임대 및 그 값을 리턴하는 경우에 대한 처리가 잘 이해됐습니다.

 

강의중에 말씀해주신 것 처럼 소유권 임대와 라이프사이클은 여러번 반복해서 학습해야 될 것 같습니다.

 

다시 한번 상세한 답변 감사드립니다.

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

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

Đặt câu hỏi