2014-11-20 4 views
2

나는이 두 가지 명백하게 유사한 프로그램의 결과에 놀랐습니다.주소의 범위 : 오래 살지 않습니다

fn main() { 
    let y: &int = &31i; 
    println!("My number is {}.",*y) 
} 
//Output 
My number is 31. 

그러나이 코드는 오류입니다. y 선언 한 후이 y에 할당하는 경우

fn main() { 
    let y: ∫ 
    y = &31i; 
    println!("My number is {}.",*y) 
} 
// Output on Rust Playpen 
3:12 error: borrowed value does not live long enough 
5:2 note: reference must be valid for the block at 1:10... 
3:13 note: ...but borrowed value is only valid for the statement at 3:4 

분명히, &31i이 범위를 벗어나. 그러나 동일한 줄에있는 경우 y이 선언 된 경우 범위에 그대로 있습니다. 나는 이것이 왜 그런지 이유를 알지 못한다.

녹의 디자인으로 인해 이런 식으로 행동하게됩니까? 미리 감사드립니다.

답변

3

나는 이것이 바인딩 또는 다른 곳에 사용될 때 & 연산자에 대한 다른 규칙 때문에 발생한다고 생각합니다.

이 :

let y: &int = &31i; 

이 동등하다 : 그 temp 제외

let temp: int = 31i; 
let y: &int = &temp; 

가 보이지 않는다. 이것은 예를 들어 설명된다. lifetimes guide에 있지만,이 가이드는 (다른 가이드와 마찬가지로) 아직 다시 작성되지 않은 이전 버전 인 것 같습니다.

하지만이 :

let y: ∫ 
y = &31i; 

그렇게 31i의 삶에만 발현 (즉 31i) 내에서, 어떤 이유로 그러한 의미를 가지고 있지 않습니다. 결과적으로 즉시 삭제되므로 참조 할 수 없습니다.

나는 다소 직관력이 떨어지며 문제를 일으킬만한 가치가 있다고 주장합니다. 어쩌면 이것은 중요한 것 때문에 간과 된 것들 중 하나 일 것입니다.

+0

Niko의 블로그에서 임시 직원의 생애가 무엇인지 알아 내려고했던 기사를 읽은 것을 기억합니다. 당신이 차용의 범위를 엄격하게하기를 원하기 때문에, 관대하고 제한적인 상세한 규칙을 생각해내는 것은 꽤 어려웠습니다. –