数组 – 尽可能采取`Iterator`而不是`Vec`?

函数以一系列值作为参数时,是否认为接受迭代器T的良好风格.而不是Vec T

这样,呼叫者可以自己决定如何存储该系列(在Vec,[T; N]或其他任何内容中),实际上应该是可选的< T>).此外,这样就无需将您所拥有的任何内容转换成Vec,而且在应用了一些Iterator修饰符之后,不需要.collect().所以也应该更快!

我错过了什么,还是这样做呢?

解决方法

你所描述的这样的功能通常应该是一个 IntoIterator<Item = T>;因此它可以接受迭代器< T>和Vec T作为输入.

这也可以与其他技术结合使用;例如,该方法concat将接受& str(通过auto deref / ref强制)& [String](以及& Vec< String)& [& str](以及& Vec&,& 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
}

(这个具体的例子实际上通常会更适合于SliceConcatExt,因为它能够计算出最终结果将在多长时间内,因此可以一次性分配正确的长度字符串,但这仅仅是一个概念的证明,以及多少花哨技术可以结合起来.)

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...