2016-11-07 4 views
2

私はどのスライスが錆にあるのか疑問に思いました。それが判明したように、それは内部にデータポインタとサイズを持つ構造体です。私は、インデックス作成のためのソースを見ていると私はfound thisをしました:スライスインデックス作成はどのようにしてRustで機能しますか?

impl<T> ops::Index<usize> for [T] { 
    type Output = T; 

    fn index(&self, index: usize) -> &T { 
     // NB built-in indexing 
     &(*self)[index] 
    } 
} 

私は錆の専門家ではないが、私のためのポインタのように&(*self)ようで、ラストにはポインタのインデックスは、私の知る限りありません。では、このインデックス作成の仕組みはどのように機能しますか?それは単なるコンパイラ組み込みのものですか?

+1

@LukasKalbertodt申し訳ありません、編集済み! –

答えて

1

コンパイラの内蔵物ですか?

はい。ソースコードのコメントにも同じことが言われています。 [T]はサイズの小さいタイプであり、とにかくいくつかの特別なルールが必要です。例えば、サイズの指定されていない型はスタック上に存在することはできません(処理するのはかなり難しい)。しかし、サイズの指定されていない型への参照は、ポインタとサイズ(具体的には「型を完成させるもの」で構成されています)。

ただし、式は&((*self)[index])のように評価されます。これは、self(タイプ&[T])がタイプ[T]にデリファレンスされ、次に索引付けされることを意味します。これによりTが返されますが、参照先が必要なのは&です。

+1

私はいつも値で返ってきて、正直言って変わった「&」を追加しなければならないというこの索引付けの考えを見つけました。私の直感の叫び声:なぜ一時的な言及を参照するのですか? @MatthieuM。 –

+1

。インデックスは、lvalueを生成します。これは、一時的な値(右値) –

+0

@ Khaの反対です。残念ながら、これはエラーメッセージではありません:['[0]' 'String'を返す、 //play.rust-lang.org/?gist=59e1a830c94433d92f52721904c09089&version=stable&backtrace=0)、つまり(新鮮な)値です。私はそれが事実ではないことを知っていますが、私はこれにもかかわらず、これは本当に混乱していることがわかります。 (たぶん、診断を改善することが事態を明らかにするための道のりになるかもしれません)。 @MatthieuM。 –

関連する問題