2016-02-22 60 views
3

你會如何改變一個載體的方式,你需要一個不變的引用到所述的載體來決定你需要如何改變載體?例如,我有一段代碼,看起來這樣的事情,我要複製的向量的最後一個元素:可以不定式地訪問一個載體的元素

let mut vec: Vec<usize> = vec![123, 42, 10]; 
// Doesn't work of course: 
vec.push(*vec.last().unwrap()) 
// Works, but is this necessary? 
let x = *vec.last().unwrap(); 
vec.push(x); 

回答

4

一成不變參考[...],以確定你將如何需要變異載體?

簡短的答案是你沒有。對矢量的任何突變都可能使使所有現有引用無效,從而使將來的任何操作訪問無效數據,從而導致段錯誤。 Safe Rust不允許這種可能性。

你的第二個例子創建了一個副本的向量中的值,所以它不再重要的矢量;該價值將繼續有效。

第一個例子的不幸之處在於,如果你遵循操作的順序,人類可以知道在變異發生之前檢索到不可變的值。實際上,這就是爲什麼多語句版本可能的原因!這實際上是Rust借用檢查器的當前侷限性。有investigation ongoing看看是否可以解除這些類型的限制。

+0

那麼除了複製之外,沒有任何安全的方法可以做到這一點? – lochnesscookie

+0

噢,謝謝你的澄清! – lochnesscookie

相關問題