如何确定是否将 .clone() 和 .cloned() 与迭代器一起使用

the*_*fer 6 rust

假设我们有一个可以克隆的某种类型的向量

let foo_vec = vec![clonable_item_1, clonable_item_2, ...];
Run Code Online (Sandbox Code Playgroud)

如何判断是否使用.clone()以及.cloned()何时迭代?

foo_vec.iter().cloned()...

// vs

foo_vec.clone().iter()...
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于两者之间差异的文字。有什么不同?

Cha*_*man 12

他们根本不平等。如果有的话,它应该是v.iter().cloned()vs. v.clone().into_iter(),两者都生成一个 overowned 的迭代器T,同时v.clone().iter()生成一个 over 的迭代器&T

v.clone().into_iter()克隆Vec,分配Vec相同大小的 a 并将所有元素克隆到其中,然后将新创建的元素转换Vec为迭代器。v.iter().cloned(),OTOH,在Vec生成的上创建一个借用的迭代器&T,然后将cloned()迭代器适配器应用于它,该适配器动态克隆由&T生成的Iterator::next()来生成一个拥有的T。因此它不需要分配新的向量。

因此,您应该尽可能选择v.iter().cloned()(通常是这样,但是Vec'sIntoIter具有附加功能,例如获取可能需要的底层切片)。