在 Go 中,复制切片是标准操作,如下所示:
# It will figure out the details to match slice sizes
dst = copy(dst[n:], src[:m])
在 Rust 中,我找不到类似的替换方法。我想出的东西看起来像这样:
fn copy_slice(dst: &mut [u8], src: &[u8]) -> usize {
let mut c = 0;
for (&mut d, &s) in dst.iter_mut().zip(src.iter()) {
d = s;
c += 1;
}
c
}
不幸的是,我遇到了无法解决的编译错误:
error[E0384]: re-assignment of immutable variable `d`
--> src/main.rs:4:9
|
3 | for (&mut d, &s) in dst.iter_mut().zip(src.iter()) {
| - first assignment to `d`
4 | d = s;
| ^^^^^ re-assignment of immutable variable
我该如何设置d
?有没有更好的方法来复制切片?
是的,使用方法clone_from_slice() https://doc.rust-lang.org/std/primitive.slice.html#method.clone_from_slice,它对于实现的任何元素类型都是通用的Clone
.
fn main() {
let mut x = vec![0; 8];
let y = [1, 2, 3];
x[..3].clone_from_slice(&y);
println!("{:?}", x);
// Output:
// [1, 2, 3, 0, 0, 0, 0, 0]
}
目的地x
是一个&mut [T]
切片,或者任何取消引用的东西,比如可变的Vec<T>
向量。您需要对目标和源进行切片,以便它们的长度匹配。
从 Rust 1.9 开始,您还可以使用copy_from_slice() https://doc.rust-lang.org/std/primitive.slice.html#method.copy_from_slice。其工作方式相同,但使用Copy
特质而不是Clone
,并且是直接包装memcpy
。编译器可以优化clone_from_slice
相当于copy_from_slice
适用时,但它仍然有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)