2014-10-06 4 views
0

나는 녹에 새로 온 사람과 한 순간 이해가 안 : 이해할 수없는 behaivior() -> & STR 기능

Pointer's Guide

는 말한다 : "당신은 정말 포인터를 반환해야하지 않는다"를. 저는 괜찮습니다. HelloWorld와 비슷한 프로그램에서 & str을 반환하려고했습니다. 나는 boxed String을 필요로하지 않는다. 단지 & str이어야한다. 그리고 저는이 챌린지에서 성공했지만 부분적으로 만 성공했습니다.

그래서, 질문 자체 :

내가

fn foo(p: &[uint]) -> &str { "STRING" } 

하지만 을 할 수있는 이유는 없습니다

fn foo(p: Vec<uint>) -> &str { "STRING" } //error: missing lifetime specifier [E0106] 

할 수 있지만 여전히 할 수

fn foo(p: Vec<uint>) -> &'static str { "STRING" } 

슬라이스에서 Vec 로의 전환 사실은 어떻게 바뀌나요?

P. 내 거짓 영어 및 가짜 질문에 대해 유감스럽게 생각합니다. 난 그냥 녹의 차용 - checher의 포인트를 얻을하지 않습니다 생각

+0

"포인터를 돌려 보내지 말것"비트는 호출자에게 'Box'또는 다른 소유 포인터를 강제하는 것을 의미합니다. 빌린 포인터가 과도한 왜곡없이 작동하면 사용하십시오. – delnan

답변

6

이 평생 지정자가 자동으로 추가하는 방법입니다 : 당신이 그것을 써야했다 과거

fn foo(p: &[uint]) -> &str { "STRING" } 

:

이 explicilty :

fn foo<'a>(p: &'a [uint]) -> &'a str { "STRING" } 

이 두 가지가 동일합니다 (그러나 정말 정확하지 입력 p 년 이후 str는 관련이없는 반환). 'static>'a이므로 모든 평생 동안 항상 유효합니다. 이 그래서 자동 수명 파라미터가 추가되지 않은 입력 된 기준없고 전부가 말이 없으므로

번째 예 못해 작동 (모든 참조는, 명시 적 또는 암시 수명 필요)

fn foo(p: Vec<uint>) -> &str { "STRING" } 

로서 당신은 이미 평생을 추가함으로써 그것을 고쳤습니다 :

fn foo(p: Vec<uint>) -> &'static str { "STRING" }