2016-11-07 66 views
2

我想知道Rust裏有什麼切片。事實證明,它只是一個帶有數據指針和內部大小的結構。我看了看源索引和我已經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

我總是發現這個索引的想法是按價值返回,並且不得不添加'&'怪異的,說實話。我的直覺尖叫:爲什麼要參考臨時? –

+1

@MatthieuM。索引產生一個左值,這與臨時值(右值)相反 –

+0

@Kha:不幸的是,這不是錯誤消息所說的:[它抱怨v [0]返回一個String](https: //play.rust-lang.org/?gist=59e1a830c94433d92f52721904c09089&version=stable&backtrace=0),因此是(新鮮的)值。我知道情況並非如此,但我覺得這確實令人困惑。 (也許這只是一個改善診斷將大大澄清事情的很好的例子)。 –