최소 코드 :
fn foo() {
let vector = vec![1u8, 2u8];
let a = &vector.as_slice()[0];
drop(vector);
let b = a;
}
fn bar() {
let array = [1u8, 2u8];
let a = &array[0];
drop(array);
let b = a;
}
위의 코드를 컴파일 할 때 foo
can 동안 컴파일 할 수 없습니다 bar
.
함수에서 foo
, a
빌려 vector
내가 드롭 그래서 이후 vector
, 나는 액세스 할 수 없습니다 a
더 이상.
그러나 상황은 동일 bar
하지만 bar
성공적으로 컴파일을 통과 할 수 있습니다. 이유를 모르겠습니다.
이것은 벡터와 배열에만 국한되지 않습니다. Rust가 컴파일 시간에 알려진 상수라는 것을 증명하자마자, 그것은 정적 수명을 가지고 있다고 간주합니다 (그리고이 경우 드롭은 값이 영원히 지속될 것이기 때문에 아무런 영향을 미치지 않습니다). 이 유사한 질문을 참조하십시오 .
변수 ( binding )에 넣은 간단한 상수 와 박스형 버전으로 예제를 확장했습니다 . 이것은 벡터와 배열 (사소한 상수와 동적으로 할당 된 값) 사이에서 발견 한 것과 똑같은 차이를 보여줍니다.
fn test_vec() {
let src = vec![10u8, 20u8];
let a = &src[0];
// drop(src); // rejected by compiler
let b = a;
println!("{:?}", b);
}
fn test_array() {
let src = [10u8, 20u8];
let a = &src[0];
drop(src);
let b = a;
println!("{:?}", b);
}
fn test_box() {
let src = Box::new(10u8);
let a = &src;
// drop(src); // rejected by compiler
let b = a;
println!("{:?}", b);
}
fn test_var() {
let src = 10u8;
let a = &src;
drop(src);
let b = a;
println!("{:?}", b);
}
fn main() {
test_vec();
test_array();
test_box();
test_var();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다