Vec :: as_slice와 배열의 강제간에 수명 검사가 다른 이유는 무엇입니까?

에비앙

최소 코드 :

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;
}

위의 코드를 컴파일 할 때 foocan 동안 컴파일 할 수 없습니다 bar.

함수에서 foo, a빌려 vector내가 드롭 그래서 이후 vector, 나는 액세스 할 수 없습니다 a더 이상.

그러나 상황은 동일 bar하지만 bar성공적으로 컴파일을 통과 할 수 있습니다. 이유를 모르겠습니다.

prog-fh

이것은 벡터와 배열에만 국한되지 않습니다. 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

차용 검사기가 이러한 다른 조각의 수명에 대해 불평하는 이유는 무엇입니까?

분류에서Dev

배열의 크기와 첫 번째 요소에 대한 포인터가 다른 이유는 무엇입니까?

분류에서Dev

주 함수와 다른 함수에서 배열 크기 값이 다른 이유는 무엇입니까?

분류에서Dev

점 (.)이 소스의 별칭으로 사용 된 이유와 다른 명령에도 바로 가기가없는 이유는 무엇입니까?

분류에서Dev

이 명령의 출력이 Sh와 Bash간에 다른 이유는 무엇입니까?

분류에서Dev

일부 컴파일러에서 int myarr [noconstant]와 같은 배열을 선언 할 수있는 이유는 무엇입니까? 다른 사람이 아니라?

분류에서Dev

파일에서 비트 수가 다른 이유와 동일한 파일의 이진 표현이 다른 이유는 무엇입니까?

분류에서Dev

함수의 Printf가 구조체 배열의 변수가 다른 함수에서 손상되는 것을 방지하는 이유는 무엇입니까?

분류에서Dev

특정 배열 매개 변수의 값을 가져 와서 다른 배열에 넣는 방법은 무엇입니까?

분류에서Dev

@ +와 @ {^ CAPTURE}의 길이가 다른 이유는 무엇입니까?

분류에서Dev

웹 사이트에서 검색 창의 디스플레이가 IOS와 Android에서 다른 이유는 무엇입니까?

분류에서Dev

일반 SELECT와 SELECT INTO간에 '영향을받는 행'수가 다른 이유는 무엇입니까?

분류에서Dev

배열의 요소가 다른 배열 배열의 요소와 일치하는지 여부에 따라 배열의 배열을 수정하는 방법은 무엇입니까?

분류에서Dev

3D 배열의 인쇄 결과가 Python에서 동일한 이미지의 정신적 시각화와 다른 이유는 무엇입니까?

분류에서Dev

rvalue간에 char 배열에 대한 포인터가 & "hello"와 char 배열이 다른 이유는 무엇입니까?

분류에서Dev

JavaScript "배열의 길이"가 하나 이상의 요소가있는 배열에 대해 다른 결과를 제공하는 이유는 무엇입니까?

분류에서Dev

+와 |의 차이점은 무엇입니까? 다른 변수에 추가 할 때?

분류에서Dev

루프에서 생성 된 Matlab 수치의 파일 크기가 약간 다른 이유는 무엇입니까?

분류에서Dev

사용자 공간에서 사용할 수있는 커널 헤더는 무엇입니까? 서명이나 인터페이스가 다른 디렉토리의 헤더와 다릅니 까?

분류에서Dev

PHP의 다른 배열에서 새 인덱스와 값을 추가하는 방법은 무엇입니까?

분류에서Dev

hostname 명령의 출력이 / etc / hosts와 다른 이유는 무엇입니까?

분류에서Dev

GetWindowRect (rcWindow2)의 cx / cy가 OnSize에 제공된 cx / cy와 다른 이유는 무엇입니까?

분류에서Dev

Stata anova와 SAS glm간에 Sum of Squares가 다른 이유는 무엇입니까?

분류에서Dev

결과가 cpu와 gpu간에 다른 이유는 무엇입니까?

분류에서Dev

"경로"Windows의 환경 변수와 명령 줄이 다른 이유는 무엇입니까?

분류에서Dev

배열이 크기와 중첩을 가질 수 있다면 PHP 배열의 특정 키에서 모든 데이터를 얻는 방법은 무엇입니까?

분류에서Dev

함수의 정의 및 선언에 대해 다른 서명을 가질 수있는 이유는 무엇입니까?

분류에서Dev

기수 정렬에 C의 빠른 정렬보다 많은 수의 명령어가있는 이유는 무엇입니까?

분류에서Dev

함수가 문자 배열을 반환 할 수 있지만 다른 유형의 배열을 반환 할 수없는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    차용 검사기가 이러한 다른 조각의 수명에 대해 불평하는 이유는 무엇입니까?

  2. 2

    배열의 크기와 첫 번째 요소에 대한 포인터가 다른 이유는 무엇입니까?

  3. 3

    주 함수와 다른 함수에서 배열 크기 값이 다른 이유는 무엇입니까?

  4. 4

    점 (.)이 소스의 별칭으로 사용 된 이유와 다른 명령에도 바로 가기가없는 이유는 무엇입니까?

  5. 5

    이 명령의 출력이 Sh와 Bash간에 다른 이유는 무엇입니까?

  6. 6

    일부 컴파일러에서 int myarr [noconstant]와 같은 배열을 선언 할 수있는 이유는 무엇입니까? 다른 사람이 아니라?

  7. 7

    파일에서 비트 수가 다른 이유와 동일한 파일의 이진 표현이 다른 이유는 무엇입니까?

  8. 8

    함수의 Printf가 구조체 배열의 변수가 다른 함수에서 손상되는 것을 방지하는 이유는 무엇입니까?

  9. 9

    특정 배열 매개 변수의 값을 가져 와서 다른 배열에 넣는 방법은 무엇입니까?

  10. 10

    @ +와 @ {^ CAPTURE}의 길이가 다른 이유는 무엇입니까?

  11. 11

    웹 사이트에서 검색 창의 디스플레이가 IOS와 Android에서 다른 이유는 무엇입니까?

  12. 12

    일반 SELECT와 SELECT INTO간에 '영향을받는 행'수가 다른 이유는 무엇입니까?

  13. 13

    배열의 요소가 다른 배열 배열의 요소와 일치하는지 여부에 따라 배열의 배열을 수정하는 방법은 무엇입니까?

  14. 14

    3D 배열의 인쇄 결과가 Python에서 동일한 이미지의 정신적 시각화와 다른 이유는 무엇입니까?

  15. 15

    rvalue간에 char 배열에 대한 포인터가 & "hello"와 char 배열이 다른 이유는 무엇입니까?

  16. 16

    JavaScript "배열의 길이"가 하나 이상의 요소가있는 배열에 대해 다른 결과를 제공하는 이유는 무엇입니까?

  17. 17

    +와 |의 차이점은 무엇입니까? 다른 변수에 추가 할 때?

  18. 18

    루프에서 생성 된 Matlab 수치의 파일 크기가 약간 다른 이유는 무엇입니까?

  19. 19

    사용자 공간에서 사용할 수있는 커널 헤더는 무엇입니까? 서명이나 인터페이스가 다른 디렉토리의 헤더와 다릅니 까?

  20. 20

    PHP의 다른 배열에서 새 인덱스와 값을 추가하는 방법은 무엇입니까?

  21. 21

    hostname 명령의 출력이 / etc / hosts와 다른 이유는 무엇입니까?

  22. 22

    GetWindowRect (rcWindow2)의 cx / cy가 OnSize에 제공된 cx / cy와 다른 이유는 무엇입니까?

  23. 23

    Stata anova와 SAS glm간에 Sum of Squares가 다른 이유는 무엇입니까?

  24. 24

    결과가 cpu와 gpu간에 다른 이유는 무엇입니까?

  25. 25

    "경로"Windows의 환경 변수와 명령 줄이 다른 이유는 무엇입니까?

  26. 26

    배열이 크기와 중첩을 가질 수 있다면 PHP 배열의 특정 키에서 모든 데이터를 얻는 방법은 무엇입니까?

  27. 27

    함수의 정의 및 선언에 대해 다른 서명을 가질 수있는 이유는 무엇입니까?

  28. 28

    기수 정렬에 C의 빠른 정렬보다 많은 수의 명령어가있는 이유는 무엇입니까?

  29. 29

    함수가 문자 배열을 반환 할 수 있지만 다른 유형의 배열을 반환 할 수없는 이유는 무엇입니까?

뜨겁다태그

보관