2016-12-28 32 views
9

我試圖將一個可變的矢量轉換爲Rust中的一個不可變的矢量。我認爲這將工作,但它不:如何使Rust可變引用不可變?

let data = &mut vec![]; 
let x = data;   // I thought x would now be an immutable reference 

我該如何將一個可變引用變成一個不可變的綁定?

回答

8

提領,然後再參考值:

fn main() { 
    let data = &mut vec![1, 2, 3]; 
    let x = &*data; 
} 

爲您的代碼在做什麼,你應該閱讀What's the difference in `mut` before a variable name and after the `:`?。您的變量data已經是不可變的,但它包含一個可變引用。您不能重新分配data,但可以更改指向的值。

如何將可變引用轉換爲不可變綁定?

它已經一個不可變綁定,因爲你不能改變什麼data是。

+0

嗯,這個代碼是一個函數,返回'Vec '。如果我返回'&* data',我得到一個錯誤'期望結構'std :: vec :: Vec',找到引用'。如果我返回'* data *,我得到一個錯誤'不能移出借用內容'。那個借閱檢查器還有什麼其他的嗎?我解決這個問題的方式是返回'data.clone()',但我試圖讓它更高效,但我認爲借用檢查器可能不允許這樣做,因爲我在函數中創建了該向量。也許我錯誤地解釋了我的問題,但是如何從'data'中獲得'Vec '? – jbrown

+0

@jbrown聽起來像你說的你想'let mut data = vec![1,2,3];返回數據;'。 – Shepmaster

+0

是的,這就是我一直在尋找的。謝謝。我會重新閱讀關於可變性的鐵鏽文檔 – jbrown