繁体   English   中英

如何避免“由于`v`的类型为`Vec而发生移动<char> `,它没有在循环中实现`Copy` trait&quot;

[英]How to avoid "move occurs because `v` has type `Vec<char>`, which does not implement the `Copy` trait" within loop

似乎这里发生了被禁止的借用,但我没有看到绕过它的方法来做我需要做的事情。 在循环中设置 mut 值之后,我尝试将其保存到另一个 Vec 中时,似乎会出现问题。 有没有一种干净的方法来解决这个问题,或者有一种方法可以向编译器展示这个动作,这样我就不会得到错误? 我将在代码片段下方包含错误:

let mut result: Vec<String> = vec![];
let mut v = vec![];
for idx in 0..board.spaces.len() {
    let c: char = match board.count_at(idx as u32) {
        0 => ' ',
        1 => '1',
        2 => '2',
        3 => '3',
        4 => '4',
        5 => '5',
        6 => '6',
        7 => '7',
        8 => '8',
        _ => 'F'
    };

    v.push(c);

    if idx as u32 + 1 % board.width == 0 {
        result.push(v.into_iter().collect());
        v.clear();
    }
}

错误:

error[E0382]: borrow of moved value: `v`
   --> src/lib.rs:41:9
    |
26  |     let mut v = vec![];
    |         ----- move occurs because `v` has type `Vec<char>`, which does not implement the `Copy` trait
...
41  |         v.push(c);
    |         ^^^^^^^^^ value borrowed here after move
...
44  |             result.push(v.into_iter().collect());
    |                           ----------- `v` moved due to this method call, in previous iteration of loop
    |
note: this function takes ownership of the receiver `self`, which moves `v`

您的代码不起作用的原因是因为.into_iter()消耗了Vec并且以后不能再在程序中使用它。 您可以通过以下方式解决此问题:

result.push(v.iter().clone().collect());

但我会将临时数据保存在String中,并将其克隆推送到Vec

let mut result: Vec<String> = vec![];
let mut s = String::new();
for idx in 0..board.spaces.len() {
    let c: char = match board.count_at(idx as u32) {
        0 => ' ',
        1 => '1',
        2 => '2',
        3 => '3',
        4 => '4',
        5 => '5',
        6 => '6',
        7 => '7',
        8 => '8',
        _ => 'F'
    };

    s.push(c);

    if idx as u32 + 1 % board.width == 0 {
        result.push(s.clone());
        s.clear();
    }
}

您可以将Vec::append()用于“清空自己,将所有元素传递给新向量”:

let mut result: Vec<String> = vec![];
let mut v = vec![];
for idx in 0..board.spaces.len() {
    let c: char = match board.count_at(idx as u32) {
        0 => ' ',
        1 => '1',
        2 => '2',
        3 => '3',
        4 => '4',
        5 => '5',
        6 => '6',
        7 => '7',
        8 => '8',
        _ => 'F'
    };

    v.push(c);

    if idx as u32 + 1 % board.width == 0 {
        let mut s = Vec::new();
        s.append(&mut v); // Pass all elements from `v` to `s`.
        result.push(s.into_iter().collect());
    }
}

您也可以直接使用String并使用push()推送字符,但由于String不包含append方法,您可以使用std::mem::take()

let mut result: Vec<String> = vec![];
let mut v = String::new();
for idx in 0..board.spaces.len() {
    let c: char = match board.count_at(idx as u32) {
        0 => ' ',
        1 => '1',
        2 => '2',
        3 => '3',
        4 => '4',
        5 => '5',
        6 => '6',
        7 => '7',
        8 => '8',
        _ => 'F'
    };

    v.push(c);

    if idx as u32 + 1 % board.width == 0 {
        result.push(std::mem::take(&mut v));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM