C.W.K.
Stream
Lesson 04 of 05 · published

구조체의 Lifetime

~11 min · lifetimes, structs, borrowed-fields

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

구조체는 보통 자기 데이터를 소유해. 근데 가끔 구조체가 참조를 들길 원할 때가 있어 — 그러는 순간 구조체는 lifetime 표기가 필요해.

빌리는 구조체

구조체 필드가 참조면, 구조체는 그 참조가 가리키는 것보다 오래 못 살아. 안 그러면 구조체가 dangling 참조를 들게 되니까 — borrow checker 가 금지하는 바로 그거. 그래서 구조체에 lifetime 을 표기해서, 구조체의 유효성을 빌린 데이터의 것에 묶어.

표기가 강제하는 것

'a 로 선언된 구조체는 그 참조가 빌린 데이터보다 오래 못 살아. 빌린 값이 drop 된 뒤에 구조체를 유지하려 하면 컴파일러가 거부해. 표기는 그 자체를 위한 장부질이 아니야 — 컴파일러가 '참조는 dangle 못 한다' 규칙을 네 타입을 통해 전파하는 거야.

빌릴 이유가 없으면 소유 필드를 선호해. String 을 든 구조체는 자기 데이터를 소유하고 lifetime 골치가 없어. &str 을 든 구조체는 복사를 피하지만 빌린 출처에 자기를 묶어. 복사가 진짜 문제될 때만 빌린 필드로 손 뻗어.

여기가 초보가 벽을 느끼는 곳

참조를 든 구조체가 lifetime 표기가 줄줄이 번지는 곳이야 — 빌린 필드 하나가 구조체에, impl 블록에, 필드를 반환하는 메서드에 lifetime 을 강제해. 일상 Rust 에서 가장 표기가 많은 구석이고, 정직한 조언은: 소유 필드로 시작하고, 프로파일링이 복사가 문제라고 말할 때만 빌림으로 손 뻗어.

Code

참조를 든 구조체·rust
// 구조체는 빌린 str 보다 오래 못 산다.
struct Excerpt<'a> {
    part: &'a str,
}

impl<'a> Excerpt<'a> {
    fn announce(&self) -> &str {
        self.part
    }
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first = novel.split('.').next().unwrap();
    let e = Excerpt { part: first }; // novel 에서 빌림
    println!("{}", e.announce());
    // `e` 는 `novel` 보다 오래 못 삶 — 컴파일러가 보장
}

External links

Exercise

&str 필드랑 lifetime 을 가진 구조체를 정의해. String 에서 빌리는 인스턴스를 만들고, 구조체를 아직 쓰는 동안 String 을 drop 하려 해봐. 에러를 읽어. 그다음 구조체를 String 필드를 소유하게 다시 써봐 — lifetime 표기가 완전히 사라지는 걸 봐.
Hint
데이터를 소유하면 빌림 관계가 없어지니 표기할 게 없어. 그래서 소유 필드가 더 단순한 기본값이야 — lifetime 을 통째로 비켜가.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.