假设我们有一个可以克隆的某种类型的向量
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具有附加功能,例如获取可能需要的底层切片)。