无法将一个 Rust 向量附加到另一个向量中。

3
我正在用Rust做一个Leetcode问题,遇到了以下错误:
fn plus_one(digits: &mut Vec<u32>) -> &Vec<u32> {
    for i in (0.. digits.len()).rev() {
        if digits[i] < 10 {
            digits[i] = digits[i] + 1;
            break;
        }else{
            digits[i] = 0;
        }
    }

    if(digits[0] == 0) {
        let mut new_digits : Vec<u32> = vec![1];
        new_digits.extend(digits).        // This is the error
    }

    digits
}

出现错误:
--> src/easy/plus_one.rs:13:20
   |
13 |         new_digits.extend(digits)
   |                    ^^^^^^ the trait `Extend<&mut u32>` is not implemented for `Vec<u32>`
   |
   = help: the following other types implement trait `Extend<A>`:
             <Vec<T, A> as Extend<T>>
             <Vec<T, A> as Extend<&'a T>>

什么问题,我该如何解决?
1个回答

6

&mut Vec<u32>的迭代器产生&mut u32。但Vec无法从此进行扩展(尽管可以从&u32的迭代器进行扩展)。

最简单的修复方法是使用extend_from_slice()

fn plus_one(digits: &mut Vec<u32>) -> &Vec<u32> {
    for i in (0..digits.len()).rev() {
        if digits[i] < 10 {
            digits[i] = digits[i] + 1;
            break;
        } else {
            digits[i] = 0;
        }
    }

    if digits[0] == 0 {
        let mut new_digits: Vec<u32> = vec![1];
        new_digits.extend_from_slice(digits);
    }

    digits
}

另外,u32copy,所以你可以将迭代器copied()一下,它会正常工作。不过显然你首先需要明确地iter()一下,所以extend_from_slice可能是一个更好的选择。 - undefined
@Masklinn 如果LLVM不将其优化为memcpy,那么它也可能效率较低。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接