【问题标题】:Difference between copied and cloned on Rust iteratorsRust 迭代器上复制和克隆的区别
【发布时间】:2019-10-16 12:41:19
【问题描述】:

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

与 Copy 的不同之处在于 Copy 是隐式的并且非常便宜,而 Clone 始终是显式的并且可能会或可能不会很昂贵。 [...] 由于 Clone 比 Copy 更通用,因此您可以自动将任何 Copy 复制为 Clone。

...但是对于迭代器来说,这两种方法都是显式的,那么copied() 的意义何在?我应该总是使用cloned(),因为它适用于更一般的情况吗?

【问题讨论】:

    标签: rust iterator copy clone


    【解决方案1】:

    我设法找到(感谢Peter!)this pull request,这解释了除了cloned()之外添加copied()的原始原因...

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

    【讨论】:

    • 这似乎是这样。不错的答案?
    【解决方案2】:

    我是否应该一直使用 cloned(),因为它适用于更一般的情况?

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

    【讨论】:

    • 感谢您的回答!我创建了一个简单(且无用)的示例 here 来测试它,但 Clippy 似乎并没有警告我可以使用 copied() 而不是 cloned()...
    • @Zak 看来你是对的。 Clippy 可以suggest the most appropriate of copied or cloned,但currently 不建议在您已经在使用clone 时使用copied
    • 啊好吧,这真的很有帮助……还让我找到了this,这解释了copied()的初衷
    • 现在似乎已经出现了针对此的剪辑警告(至少在夜间),请参阅 rust-lang.github.io/rust-clippy/master/…
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2020-08-24
    • 2011-07-10
    • 1970-01-01
    • 2013-04-28
    • 2012-06-14
    • 2011-07-17
    相关资源
    最近更新 更多