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

Lifetime Elision & 'static

~11 min · lifetimes, elision, static

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

lifetime 이 사방에 있다면, 왜 너는 거의 안 썼지? 컴파일러가 elision 규칙 을 적용하거든 — 뻔한 경우를 채워줘서 네가 안 해도 되게 하는 기본값 묶음.

elision 규칙 세 개

하나: 각 참조 파라미터는 자기 lifetime 을 받아. 둘: 입력 lifetime 이 정확히 하나면, 그게 모든 출력에 할당돼. 셋: &self 파라미터 (메서드) 가 있으면, 그 lifetime 이 모든 출력에 할당돼. 이 셋이 함수 대다수를 커버해 — 그래서 fn first_word(s: &str) -> &str 가 표기 불필요해: 규칙 둘이 단일 입력의 lifetime 을 출력에 할당하거든.

elision 이 못 정할 때

longest 함수는 elision 에 실패해, 입력 lifetime 이 이라 규칙 둘이 안 먹거든 — 컴파일러가 출력이 어느 쪽에서 빌리는지 못 추측해. 그게 네가 끼어들어 표기하는 정확한 틈이야. elision 은 뻔한 걸 처리하고; 너는 모호한 걸 처리해.

먼저 표기 없이 써봐. elision 덕에 참조를 반환하는 함수 대부분이 그냥 컴파일돼. 컴파일러가 관계를 못 추론한다고 말할 때만 명시적 'a 로 손 뻗어 — 표기하기 전에 컴파일러가 물어보게 둬.

특별한 lifetime: 'static

'static 은 '프로그램 전체 동안 유효' 라는 뜻이야. 문자열 리터럴이 &'static str 이야 — 바이너리에 구워져서 절대 해제 안 돼. 진짜 쓸모 있는 lifetime 이지만, 초보가 에러 잠재우려고 'static 을 갖다 붙이면 보통 더 깊은 소유권 문제를 가려. 데이터가 진짜 영원히 살 때 써, 에러 잠재우개로 말고.

Code

Elision: 왜 대부분 함수가 표기 불필요한가·rust
// 'a 불필요: 입력 lifetime 하나, 규칙 2 가 출력에 할당.
fn first_word(s: &str) -> &str {
    s.split(' ').next().unwrap_or("")
}

// 'static: 프로그램 전체를 산다 (문자열 리터럴이 &'static str)
fn motto() -> &'static str {
    "fearless"
}

fn main() {
    println!("{}", first_word("hello world"));
    println!("{}", motto());
}

External links

Exercise

함수 세 개를 써봐: &str 하나 받아 &str 반환하는 거 (elided), 구조체에서 &self 의 필드를 반환하는 메서드 (규칙 3 으로 elided), &'static str 리터럴을 반환하는 거. 각각 어느 elision 규칙 (또는 'static) 이 적용되는지 설명해봐.
Hint
입력 하나 -> 규칙 2. &self 메서드 -> 규칙 3. 리터럴 -> 'static. 규칙 이름을 댈 수 있으면, 표기가 왜 필요하거나 불필요한지 이해한 거야.

Progress

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

댓글 0

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

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