2014-12-15 3 views
3

나는 녹이기 일생 동안 내 머리를 감싸려고 노력하고있다. (공식 가이드가 그걸 잘 설명하지는 않았기 때문에).녹 수명은 참고 문헌만을 참조합니까?

녹 녹이 수명은 참조만을 참조합니까? 아니면 기본/원시 값도 참조 할 수 있습니까?

+0

참조는 실제로 안전하게 입력 된 포인터이며 평생 제어는 전달 된 참조가 매달린 포인터가되지 않도록하는 것입니다. value (copy)에 의해 전달 된 매개 변수는 이것에 대해 걱정할 필요가 없습니다. 더 깊은 스택 프레임에 의해 소유 된 변수 만이 위치에 대한 모든 포인터가 제거되기 전에 무효화 될 수 있습니다. – Jeff

답변

4

수명은 값과 상기 값에 대한 참조 사이의 링크입니다.

이 링크를 이해하려면 깨진 병렬을 사용합니다. 집과 주소.

은 실제 엔티티입니다. 그것은 한때 땅 위에 지어졌으며 수십 또는 백 년 동안 살 것이며이 시간 동안 여러 번 개조 될 수 있으며 어느 시점에서 대부분 파괴 될 것입니다.

주소은 논리적 개체이며 집이나 다른 물리적 개체 (필드, 학교, 기차역, 회사 본사 등)를 가리킬 수 있습니다. 집의


수명은 비교적 명확하다 :이 집은 그것이 파괴되는 순간에 내장 된 순간부터, 사용할 수있는 동안 시간을 ​​나타냅니다. 이 집은이 기간 동안 몇 차례의 수리 작업을 거칠 수 있으며 단순한 카바나였던 곳은 결국 본격적인 장원이 될 수도 있습니다. 그러나 그것은 우리에게 아무런 문제가되지 않습니다. 우리의 목적을 위해 그 집은 입니다. 그러한 변화를 통해에 살고 있습니다. 그것의 창조와 궁극적 인 파괴 만이 중요합니다 ... 우리가 지붕을 찢을 때 아무도 침실에 있지 않으면 더 좋을지라도.

이제 부동산업자라고 상상해보십시오. 당신은 당신이 사무실에서 판매하는 집을 지키지 않습니다. 실용적이지 않습니다. 그러나 당신은 그들의 주소를 지키십시오!

귀하가 보낸 주소가 ... 쓰레기 수거통의 주소 였기 때문에 고객이 불평 할 때가 종종 있습니다. 사진이있는 아름다운 2 층 집이 아닙니다. 의. 경찰서에서 귀하의 사무실에서 소책자를 가지고있는 사람들이 방금 파괴 된 집에서 발견 된 이유를 묻는 질문을받을 수도 있습니다. 그 후 계속되는 소송으로 귀하의 비즈니스가 중단 될 수 있습니다.

이것은 분명히 비즈니스에 위험이 될 수 있으므로 더 나은 해결책을 찾아야합니다. 각 주소에 언급 된 집의 수명이 표시 될 수 있으므로 사람들을 죽음 (실망)에 보내지 않는 것을 알 수 있습니까?


가비지 덤프에서 C 매뉴얼 메모리 관리 전략을 알고있을 수도 있습니다. C에서 귀하의 주소 (포인터/참조) 항상 거실을 참조하는지 확인하려면 부동산 중개인 개발자에게 달려 있습니다.

그러나 녹에서는 참고 문헌에 특수 마커 태그 'enough; 그것은 참조 된 값의 수명에 대한 하한을 나타냅니다.

여전히 값이 살아 :

기준의 사용량 안전 컴파일러 검사 여부

여부, 그것은 질문을?

당신이 가지고있는 용도로 길게는 'enough에 머무르는 한, 그 값이 100 년 후에 나타날지는 중요하지 않습니다. 당신이 코드에서 평생 주석 (예를 들어, 'a)를 참조하면

+0

이 문제를 되돌아 보니, 저는 평생을 알고 있습니다. * 녹 * 일생은 나를 쫓아 버리는 것이었다. 구문과 사용 방법은 혼란 스러웠습니다. – Qix

+0

개념을 이해하기위한 기본 아이디어를 전달하기 위해 불필요한 세부 정보가 너무 길고 자세한 답변. – nbro

+0

@nbro : 고마워요. :) 당신이 더 잘 할 수 있다고 생각한다면 꼭 대답 해주세요! –

1

예, 참조 만 참조하지만 참조는 기본 유형을 참조 할 수 있습니다. Rust는 값으로 전달되는 기본 유형과 참조로 전달되는보다 복잡한 유형 (Java의 객체)을 구별하는 Java (및 유사한 언어)와 다릅니다. 복잡한 유형을 스택에 할당하고 값으로 전달할 수 있으며 참조를 원시 유형으로 가져올 수 있습니다. 예를 들어

여기 i32 년대에 두 참조를 취하는 함수이며,보다 큰 참조를 반환 하나

fn bigger<'a>(a: &'a i32, b: &'a i32) -> &'a i32 { 
    if a > b { a } else { b } 
} 

그것은 통신하는 수명 'a을 사용하는 리턴 기준의 수명 는 전달 된 참조와 동일합니다.

1

아니요, 값도 참조하십시오. 문맥에 따라 얼마나 오래 살아갈 지 명확하지 않은 경우 주석을 추가해야합니다. 그런 다음 평생 바운드라고합니다. 이 값이 참조가 참조되는 것을 지정해야합니다 다음 예제에서

는 기준 자체가 적어도 한 생활 :

use std::num::Primitive; 

struct Foo<'a, T: Primitive + 'a> { 
    a: &'a T 
} 

+ 'a와 컴파일러가 불평을 삭제하십시오. TPrimitive을 구현하는 것이므로 반드시 필요합니다.

0

는 거의 항상 참조가, 또는 포인터, 참여를 빌렸다.

빌린 포인터의 전체 구문은 &'a T입니다. 'a대상의 수명입니다. T이 대상입니다.

구조체와 열거 형은 평생 매개 변수를 가질 수 있습니다. 이는 일반적으로 빌린 포인터가 포함 된 struct 또는 enum의 결과입니다. 구조체 나 열거 형에 빌린 포인터를 저장할 때는 명시 적으로 레퍼 런트의 수명을 명시해야합니다. 예를 들어 표준 라이브러리의 Cow 열거 형은 해당 변형 중 하나에서 빌린 포인터를 포함합니다. 따라서, 레포 런트의 수명을 정의하기 위해 빌린 포인터의 유형에 사용되는 수명 매개 변수가 있습니다.

특성에는 유형 경계와 수명 한계가있을 수 있습니다. 수명 한계는 그 특성의 구체적인 구현에서 모든 빌린 포인터가 유효한 (즉, 그들의 지시 대상이 살아있는) 가장 큰 영역을 가리킨다. 구현에 빌려준 포인터가 없으면 수명은 'static으로 추정됩니다. 수명 기간은 형식 매개 변수 정의, where 절 및 특성 개체에 나타날 수 있습니다.

가끔 라이프 타임 매개 변수가 있지만 빌릴 해당 값이없는 struct 또는 enum을 정의하고자 할 수 있습니다.ContravariantLifetime<'a>과 같은 마커 유형을 사용하여 수명 매개 변수에 적절한 분산 (ContravariantLifetime)이 빌려온 포인터의 분산에 해당하는지 확인하고, 마커가 없으면 수명이 다른 것이므로 수명이 다른 것으로 대체 될 수 있습니다 평생 ...별로 유용하지 않아!). See an example of this use case here.