rust 如何借但保持

yk9xbfzb  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(63)

我有一个很大的结构体,例如Vec<i32>。现在我的代码看起来像

fn main() {
    let mut arr = vec![0, 1, 2];
    // Lot of code pre
    arr.push(5);
    // Lot of code post
    println!("{:?}", arr);
}

字符串
我想把它取出来这样看起来就像

fn main() {
    let mut arr = vec![0, 1, 2];
    my_push(arr, 5);
    println!("{:?}", arr);
}

fn my_push(mut arr: Vec<i32>, x: i32) {
    // Lot of code
    arr.push(x);
    // Lot of code
}


如何针对具体情况实施?我只需要把这件东西转换成单独的功能。我得到错误,因为arr被移动到my_push,在那里它被销毁。

error[E0382]: borrow of moved value: `arr`
 --> src/main.rs:4:22
  |
2 |     let mut arr = vec![0, 1, 2];
  |         ------- move occurs because `arr` has type `Vec<i32>`, which does not implement the `Copy` trait
3 |     my_push(arr, 5);
  |             --- value moved here
4 |     println!("{:?}", arr);
  |                      ^^^ value borrowed here after move

bq8i3lrv

bq8i3lrv1#

你可以通过传入一个可变的引用来解决这个问题,因为现在你把它的所有权交给了函数,于是它就被丢弃了,再也不会出现了。
考虑这种变化:

fn main() {
    let mut arr : Vec<i32>  = vec![0, 1, 2];

    // Use a mutable reference to a mutable local
    my_push(&mut arr, 5);

    // Local array has been mutated
    println!("{:?}", arr);
}

fn my_push(arr: &mut Vec<i32>, x: i32) {
    // Here arr behaves largely like it's a local variable,
    // except for some minor restrictions like not being able
    // to move it.
    arr.push(x);
}

字符串
请记住,Rust非常重视所有权。如果你习惯了像Python、JavaScript或Ruby这样的语言,在这些语言中,像这样传入数组总是作为一个隐式引用来完成的,那么在Rust中绝对不是这样。引用 * 必须 * 是显式的,如&&mut

相关问题