尽可能采用`Iterator`代替`Vec`?

Kap*_*chu 10 arrays iterator vector rust

当一个函数将一系列值作为参数时,它被认为是接受Iterator<T>而不是Vec<T>?的好风格?

这样,调用者可以自己决定如何存储系列(在a Vec,a [T; N]或其他任何内容中,实际上Option<T>应该是可能的!).此外,这消除了将所有内容转换为a的需要Vec,并且在应用一些Iterator修饰符后,.collect()不需要!所以它也应该更快!

我错过了什么或这是应该做的方式吗?

Chr*_*gan 11

你描述的这种功能通常应该通常采用IntoIterator<Item = T>; 因此可以同时接受Iterator<T>Vec<T>作为输入.

这也可以与其他技术结合使用; 例如,此方法concat将接受&[&str](并因此&Vec<&str>通过自动deref/ref强制),&[String](因此&Vec<String>),&str迭代器,String迭代器等等:

use std::borrow::Borrow;

fn concat<T: Borrow<str>, Iter: IntoIterator<Item = T>>(iter: Iter) -> String {
    iter.into_iter()  // -> impl Iterator<Item = T>
        .map(|s| s.borrow()) // -> impl Iterator<Item = &str>
        .collect()  // -> String
}
Run Code Online (Sandbox Code Playgroud)

(这个具体的例子实际上通常更适合SliceConcatExt,因为它能够计算最终结果预先存在多长时间,从而一次性分配正确的长度字符串.但它只是概念的证明以及多种花式技术可以合并.)