在Rust迭代器上复制和克隆之间的区别

Zak*_*Zak 3 iterator clone copy rust

我试图弄清楚Rust 特征上copied()cloned()方法之间的区别Iterator。查看上的文档Clone,我可以看到...

与Copy的不同之处在于,Copy是隐式的并且非常便宜,而Clone始终是显式的,可能昂贵也可能不昂贵。[...]由于“复制”比“复制”更笼统,因此您也可以自动使“复制”成为“复制”。

...但是对于迭代器来说,这两种方法都是显式的,所以有什么意义copied()?我是否应该一直使用cloned()它,因为它在更一般的情况下会起作用?

Pet*_*all 6

我是否应该一直使用cloned(),因为它在更一般的情况下会起作用?

通常,Rust优化器将能够确定可以用更快的副本替换克隆。但是,这不能保证,因此copied()请尽可能使用,以确保最终得到最快的二进制文件。

  • @Zak看来你是对的。Clippy可以[建议最适合复制或克隆](https://github.com/rust-lang/rust-clippy/pull/3970),但不能[_currently_](https:// github.com/rust-lang/rust-clippy/issues/3870)建议您在已经使用`clone`时使用`copied`。 (3认同)

Zak*_*Zak 6

我设法找到(感谢Peter!)这个拉取请求该请求解释了copied()除了cloned()... 之外添加的原始原因。

复制的目的是避免在执行代码重构后意外克隆迭代器元素,从而导致结构不再被复制。这是一个相对常见的模式,可以通过调用rg --pcre2 '[.]map[(][|](?:(\w+)[|] [*]\1|&(\w+)[|] \2)[)]'Rust主存储库看到。此外,克隆的许多用途实际上只是想简单地复制,而将某些内容更改为不再可复制可能会引起明显的性能损失。