Rust 如何惯用地复制一个片段?

Rust 如何惯用地复制一个片段?,rust,slice,Rust,Slice,在Go中,复制切片是标准费用,如下所示: 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 } #它将找出与切片大小匹配的细节 dst=复制(dst[n:],src[

在Go中,复制切片是标准费用,如下所示:

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
}
#它将找出与切片大小匹配的细节
dst=复制(dst[n:],src[:m])
在《铁锈》中,我找不到类似的替换方法。我想到的东西是这样的:

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
}
不幸的是,我遇到了无法解决的编译错误:

错误[E0384]:重新分配不可变变量'd`
-->src/main.rs:4:9
|
3 |对于dst.iter_mut().zip(src.iter())中的(&mut d,&s){
|-第一次分配给` d`
4 | d=s;
|^^^^重新分配不可变变量

如何设置
d
?是否有更好的方法复制切片?

此代码有效,尽管我不确定这是否是最好的方法

fn copy_slice(dst: &mut [u8], src: &[u8]) -> usize {
    let mut c = 0;
    for (d, s) in dst.iter_mut().zip(src.iter()) {
        *d = *s;
        c += 1;
    }
    c 
}
显然,没有明确地指定访问权限就成功了。然而,我仍然对此感到困惑,我的心智模型还没有涵盖真正发生的事情。 在这些问题上,我的解决方案大多是反复试验,我更愿意真正理解。

是的,使用这种方法,它对实现克隆的任何元素类型都是通用的

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
向量。您需要对目标和源进行切片,使其长度匹配



从Rust 1.9开始,您也可以使用。其工作方式相同,但使用了
Copy
特性而不是
Clone
,并且是
memcpy
的直接包装器。编译器可以优化
Clone\u from\u slice
,在适用时等效于
Copy\u from\u slice
,但它仍然有用。

另一个变体会是

fn copy_slice(dst: &mut [u8], src: &[u8]) -> usize {
    dst.iter_mut().zip(src).map(|(x, y)| *x = *y).count()
}

请注意,在这种情况下,您必须使用
count
,因为
len
将使用
ExactSizeIterator
快捷方式,因此永远不会调用
next
,从而导致不可操作。

您能详细说明一下为什么要在片中复制数据吗?我通常希望只引用原始数据或将其复制将数据复制到拥有副本的某个对象。您的方法是正确的。您的初始版本不起作用,因为取消引用模式(如
&mut d
)会创建一个新变量(
d
)并将其分配给指针的解引用。它不提供修改原始值的功能,它只是复制原始值;如果您将其与非
复制类型一起使用,您的程序甚至不会编译。顺便说一句,您也可以将
&s
保留在适当的位置,然后编写
*d=s
。谢谢!这就是我所做的tially正在寻找,但找不到,因为我正在搜索与
copy
相关的任何内容。说实话,克隆可能是一个合适的术语……但我仍在习惯它。这不是惯用的锈病。迭代器通常不会有副作用,这里使用
map
更不是idomatic。如果是这样的话你想,一个
for
循环是正确的选择。我承认这是一种黑客行为,但是
for
循环需要手动跟踪迭代次数。你可以使用
inspect
而不是
map
来更清楚地显示“结果”“将被丢弃。@ SePiMeX,您可能需要考虑下面的示例,该示例包含在 Cuffes()中的官方锈病文档中,如下所示:<代码>让您好:String=CARS。It()。map(x和x x为u8)。map(x x(x+1)为char)。
@code\u dredd谢谢,但这不是我的答案-我只是这里的一名编辑。@Shepmaster别担心。我也不是在为这个实现辩护,或者其他什么。我只是想注意一下细节w.r.t。迭代器和/或映射没有副作用。