通过引用将Vec传递给函数

Syn*_*ose 8 rust

我在将Vec<u64>一个函数传递给函数时遇到了一些麻烦而没有移动它.我有一个函数find_factors(mut n: u64, mut fctrs: Vec<u64>),我目前正在从main调用,如下所示:

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

我现在被迫循环并在find_factors函数中打印出我的向量,因为我不确定如何传递Vec<u64>引用而不是移动它.我怎么能做到这一点?我想做的例子:

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

    //for ....
        //print vector in main!
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*eev 16

如果您不需要在向量中添加或删除元素,请使用slice(&[T])或mutable slice(&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());
Run Code Online (Sandbox Code Playgroud)

不可变切片允许您读取元素或创建子句; 可变切片还允许修改元素.但切片无法生长 - 它们只是对某些向量的看法.

看起来你需要在向量中添加新元素.正如我所说,你将无法使用切片来做到这一点; 你需要使用可变引用传递向量本身:

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);
Run Code Online (Sandbox Code Playgroud)

  • @Tomas绝对正确,因为按值传递“ Vec”非常便宜-它由三个指针大小的值组成。但是,我认为在这里按值传递它不是惯用的。毕竟,严格地讲,通过可变引用传递它是比较通用的:如果按值具有`Vec &lt;T&gt;`,则始终可以从中创建`&mut Vec &lt;T&gt;`,但是如果只有`&mut Vec &lt;T&gt;`,您将无法轻松地从中“提取”`Vec &lt;T&gt;`。 (2认同)