当前位置: 首页 > 知识库问答 >
问题:

如何惯用地复制切片?

楚骞尧
2023-03-14

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

# It will figure out the details to match slice sizes
dst = copy(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
}

不幸的是,我遇到了无法解决的编译错误:

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?有没有更好的复制切片的方法

共有3个答案

董权
2023-03-14

另一种变体是

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

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

宓弘壮
2023-03-14

这个代码工作,即使我不确定它是否是最好的方法。

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 
}

显然,没有明确指定访问权限就成功了。然而,我仍然对此感到困惑,我的心理模型还没有涵盖那里真正发生的事情。当涉及到这些事情时,我的解决方案大多是反复试验,相反,我更想真正理解。

谷隐水
2023-03-14

是的,使用方法clone\u 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要么是

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

 类似资料:
  • 问题内容: 我正在尝试将地图()的内容复制到另一个地图()内,然后清除, 以便它可以在下一次迭代/循环中获取新值。问题在于,如果不清除超级地图中的参考,就无法清除地图。这是一些伪代码。 我也尝试了一些动态的东西,但显然会引发错误(无法指定为nil) 问题是如何创建关联地图?在PHP中,我只使用aSuperMap [y] [x] = aData。似乎golang没有任何明显的方法。如果我从超级地图中

  • 问题内容: 我在正在研究的项目中遇到问题。我找到了解决方法,但是我不确定为什么我的解决方案有效。我希望对Go指针的工作方式有更多经验的人能对我有所帮助。 我有一个Model接口和一个实现该接口的Region结构。Model接口是在Region结构的指针上实现的。我也有一个Regions集合,它是Region对象的一部分。我有一种方法可以将Regions对象转换为[] Model: 当我运行此代码时

  • 我需要在Go中复制一个切片,并读取文档。有一个复制功能可供我使用。 copy内置函数将元素从源片复制到目标片。(作为一种特殊情况,它还会将字节从字符串复制到字节片。)源和目标可能重叠。Copy返回复制的元素数,它是len(src)和len(dst)中的最小值。 但当我这样做的时候: 我的和以前一样是空的(我甚至尝试使用): 你可以去游乐场看看。那么为什么我不能复制一个切片呢?

  • Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。 copy() 函数的使用格式如下: copy( destSlice, srcSlice []T) int 其中 srcSlice 为数据来源切片,destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice),目

  • 问题内容: 我在做下面的运动。 创建一个包含四个元素的切片。 创建一个新切片,并将第三个和第四个元素仅复制到其中。 我已经返回了以下程序 我程序的输出是。但我希望newElements切片为[3 4]- 我的程序出了什么问题。 问题答案: 使用内置的复制功能将元素从一个切片复制到另一个切片。 在操场上跑 您可以使用append创建切片并在单个语句中复制元素,但是代码并不像使用copy那样明显。 在

  • 编者按:这个问题来自Rust 1.0之前的版本,引用了Rust 1.0中不存在的一些项目。答案仍然包含有价值的信息。 从(比如说)一个转换成的惯用方法是什么? 例如,使用进行铸造,并且类型铸造上的Rust 0.12参考文件 数值可以转换为任何数值类型。原始指针值可以转换为任何整型或原始指针类型。不支持任何其他强制转换,并且将无法编译。 但是,将自动溢出并给出0的结果。 我发现了ToPrimitiv