2014-06-08 61 views
3

我在將一個Vec<u64>傳遞給函數時沒有移動它,但遇到一些問題。我有一個函數find_factors(mut n: u64, mut fctrs: Vec<u64>)我目前從主呼籲,像這樣:通過引用將Vec傳入函數

fn main() { 
    let mut primeFactors: Vec<u64> = Vec::new(); 
    find_factors(1134 as u64, primeFactors); 
} 

我不得不現在就遍歷並打印出我的向量在find_factors功能,因爲我不知道如何傳遞Vec<u64>作爲參考而不是移動它。我怎麼能做到這一點?什麼我想要做的例子:

fn main() { 
    let mut primeFactors: Vec<u64> = Vec::new(); 
    find_factors(1134 as u64, primeFactors); 

    //for .... 
     //print vector in main! 
} 
+0

順便提一下,首選的命名方式是'prime_factors'。 –

回答

9

如果你不需要從載體添加或刪除元素,使用片(&[T])或可變片(&mut [T]):

fn find_factors(n: u64, prime_factors: &mut [u64]) { ... } 

let mut prime_factors: Vec<u64> = Vec::new(); 
find_factors(1134 as u64, prime_factors.as_mut_slice()); 

不可改變片讓你讀的元素或創建子切片;可變片額外允許修改元素。但切片不能增長 - 它們只是一些向量的視圖。

它看起來像你需要追加新元素的向量。正如我所說,你無法用切片做到這一點。您需要使用可變引用傳遞向量本身:

fn find_factors(n: u64, prime_factors: &mut Vec<u64>) { 
    // here you can call e.g. prime_factors.push(...) 
} 

let mut prime_factors: Vec<u64> = Vec::new(); 
find_factors(1134 as u64, &mut prime_factors); 
+1

試圖學習生鏽,我有一個問題關於你的最後一個樣本:難道這是更好/更通俗的價值傳遞Vec並返回它,沒有&?由於Vec在堆上分配數據,它本身應該是非常小的權利? – Tomas

+0

@Tomas你絕對正確,因爲按值傳遞'Vec'非常便宜 - 它由三個指針大小的值組成。但是,我認爲在這裏通過價值傳遞它不會是慣用的。畢竟,通過可變引用傳遞它肯定是更一般的:如果你有一個'Vec ',你總是可以創建一個'&mut Vec ',但如果你只有'&mut Vec ',你將無法從中輕鬆「提取」Vec '。 –

+0

謝謝弗拉基米爾。好點子。 – Tomas

0

使用primeFactors.as_slice()傳遞一個向量作爲借來的指針(或者,如果你想修改的地方向量的內容primeFactors.as_mut_slice())。

將您的功能更改爲接受&[T]類型的借片。