微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组 – 尽可能采取`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,因为它能够计算出最终结果将在多长时间内,因此可以一次性分配正确的长度字符串,但这仅仅是一个概念的证明,以及多少花哨技术可以结合起来.)

原文地址:https://www.jb51.cc/java/123798.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐