2017-12-14 1 views
0
let s1 = String::from("hello world."); 
let r1 = &s1; 
let sl1 = &s1[..]; 
let sl2 = &r1[..]; 
let sl3 = r1[..]; 
println!("{}", sl3); 

무엇 sl1sl2 사이의 차이는, 왜 sl3가 잘못? r1은 이미 참조가 아니므로 &이 필요한 이유는 무엇입니까?녹의 두 조각의 차이점은 무엇입니까?

+0

[이 질문에 대한 답변 (https://stackoverflow.com/questions/27879161/what-is-the-return-type-of-the-indexing-operation-on-a-slice)도 대답합니까 당신 것? –

+0

'sl1'과'sl2'의 차이점에 관해서는 전혀 없습니다. 둘 다 '문자열'이 슬라이스로 참조 해제되게하고 슬라이스가 범위로 ​​인덱싱됩니다. https://stackoverflow.com/q/28519997/279627을 참조하십시오. –

답변

1

컴파일러 역 참조Index::index 출력 인덱싱 구문을 [] (question과 관련된 응답을 참조) desugaring. 다음과 같이 명시 형 주석 사용 바인딩의 종류가 포함된다 :

str

let r1: &str = &s1; 
let sl1: &str = &s1[..]; 
let sl2: &str = &r1[..]; 
let sl3: str = r1[..]; 
가 크기를 지정하지 않은 형태 인 스택에 넣을 수 없으며, 따라서, 로컬 변수가 sl3 결합의 형태로서 사용될 수 없으며 따라서 컴파일 오류.

관련 문제