使 Rust 中的迭代器之间复制的函数尽可能通用的正确数据类型是什么?

won*_*nce 1 types iterator rust

我通常需要在两个可迭代对象之间复制数据。除了slices特殊情况,我在标准库中没有找到合适的函数,所以我尝试自己写一个:

fn copy(source: /* ? */, target: /* ? */) {
    for (s, t) in source.zip(target) {
        *t = s.clone();
    }
}
Run Code Online (Sandbox Code Playgroud)

使该函数尽可能通用的数据类型的正确选择是什么?

Mas*_*inn 5

s.clone()
Run Code Online (Sandbox Code Playgroud)

这似乎不是很有用,因为它限制了您可以克隆的输入项。调用者可以只使用cloned()copied()调整迭代器。

唯一真正必要的约束应该是您可以将源项目分配给目标项目。

我想它看起来像

s.clone()
Run Code Online (Sandbox Code Playgroud)

但坦率地说,对于极少数情况,我需要做这样的事情,我宁愿只编写命令式循环。

  • `IntoIterator` 会让这个更通用(让你做类似 `copy(foo, &mut bar)` 而不是 `copy(foo.into_iter(), bar.iter_mut())` 的事情)。 (4认同)
  • 公平地说,从这个意义上来说,它并没有真正使函数变得更通用,因为你总是可以将 `.into_iter` 放在调用者中,但它不会使签名变得更加复杂(它实际上只是将 `Iterator` 更改为 `IntoIterator` ),而且我不确定它在哪些方面会导致膨胀。在我看来,这是首选“IntoIterator”的一个充分理由,但没有充分理由选择“Iterator”。 (2认同)