2017-12-14 6 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は既に参照されていません、なぜ&が必要ですか?Rustの2つのスライスの違いは何ですか?

+0

[この質問](https://stackoverflow.com/questions/27879161/what-is-the-return-type-of-the-indexing-operation-on-a-slice)の回答にも答えますかあなたですか? –

+0

'sl1'と' sl2'の相違点については何もありません。両方とも 'String'をスライスに逆参照させ、その後スライスを範囲でインデックス化します。 https://stackoverflow.com/q/28519997/279627も参照してください。 –

答えて

1

コンパイラデリファレンスIndex::indexの出力インデックス構文[]を脱糖(関連questionとその答えを参照)。明示的な型注釈を使用して、次のようにバインディングの種類は、このようにしている:

let r1: &str = &s1; 
let sl1: &str = &s1[..]; 
let sl2: &str = &r1[..]; 
let sl3: str = r1[..]; 

str、無サイズタイプであり、スタックに置くことができず、従ってsl3結合ローカル変数の型として使用することができません、コンパイルエラーです。

関連する問題