편집자 주 :이 코드 예는 1.0 이전의 Rust 버전이며 구문 적으로 유효한 Rust 1.0 코드는 아닙니다. 이 코드의 업데이트 된 버전은 서로 다른 오류를 생성하지만 답변에는 여전히 유용한 정보가 포함되어 있습니다. 테스트 문자열을 빌린 포인터의 벡터에, R '수명으로, 빌린 포인터를한다 ", 그리고이 유형의 서명이 의미 내가 생각빌린 참조의 수명과 벡터에 포함 된 빌려준 포인터의 관계는 무엇입니까?
fn test<'r>(xs: &'r [&str]) -> &'r str { return xs[0]; }
:
나는 녹 0.6에서이 코드를 시도 또한 R '수명으로, 문자열로 빌려 포인터를 반환하지만 컴파일러는 말한다.
refs.rs:2:8: 2:12 error: mismatched types: expected `&'r str` but found `&str` (lifetime mismatch)
refs.rs:2 return xs[0];
^~~~
refs.rs:1:39: 3:1 note: the lifetime &'r as defined on the block at 1:39...
refs.rs:1 fn test<'r>(xs: &'r [&str]) -> &'r str {
refs.rs:2 return xs[0];
refs.rs:3 }
refs.rs:1:39: 3:1 note: ...does not necessarily outlive the anonymous lifetime #1 defined on the block at 1:39
refs.rs:1 fn test<'r>(xs: &'r [&str]) -> &'r str {
refs.rs:2 return xs[0];
refs.rs:3 }
error: aborting due to previous error
이 벡터 내에서 포인터가 오래 살 수 있다는 것을 의미하는 것으로 보인다 (읽기 전용) 벡터 자체 이게 가능하니?
컴파일러에게 알릴 필요가있는 몇 가지 추가 주석이 있습니까?
마찬가지로, 소유 포인터의 벡터는 어떻습니까? 예 :
fn test<'r>(xs: &'r [~str]) -> &'r str {
return xs[0];
}
다시, 나는 적어도 한 나는 전체 목록을 차용 한대로의 벡터의 요소에 대한 포인터를 빌릴 수 있기를 기대.
fn extend<'r>(xs: ~[&'r str], ys: &'r [~str]) -> ~[&'r str]
계획이었다 : 컨텍스트에 대한
, 내 원래의 문제는 소유 포인터의 목록을 빌린 점의 목록을 확장하려고했던 모든 빌린 포인터를 가진 exended 목록을 작성, 사용 후 확장 목록을 비우고 포함 된 문자열을 포함하여 소유 포인터의 원래 목록을 비 웁니다. 입니다fn test<'r>(xs: &[&'r str]) -> &'r str {
return xs[0];
}
, 당신은 평생 연구와 문자열로 빌려 포인터를 포함 빌린 배열 포인터를 가지고,이 포인터, 같은 수명 중 하나를 반환 :
좋아요,하지만 그게 왜 잘못된 것입니까? 벡터가 어떻게 그 안에있는 참조보다 오래 살 수 있었습니까? –
@ThomasLeonard 귀하의 경우에는 벡터에 문자열에 대한 포인터가 포함되어 있습니다. 이것들이 유일한 포인터가 아닌 경우, 문자열은 벡터보다 오래 지속될 수 있습니다. –
@RamonSnir 어떻게 그 반대를 표현할 수 있습니까? 그 결과 포인터가 제공된 벡터 (적어도 훨씬 더 오래)만큼 유효 할 것이라고 말하고 싶습니다. –