当函数以一系列值作为参数时,是否认为接受迭代器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
,因为它能够计算出最终结果将在多长时间内,因此可以一次性分配正确的长度字符串,但这仅仅是一个概念的证明,以及多少花哨技术可以结合起来.)