arrays - 尽可能使用 `Iterator` 而不是 `Vec`?

标签 arrays vector iterator rust

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

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

我是不是遗漏了什么或者这是应该的方式吗?

最佳答案

您描述的此类函数通常通常采用 IntoIterator<Item = T> ;因此它可以同时接受 Iterator<T>Vec<T>作为输入。

这也可以与其他技术结合使用;例如,此方法 concat将接受 &[&str] (因此 &Vec<&str> 通过自动取消引用/引用强制),&[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
}

(这个具体示例实际上通常更适合 SliceConcatExt ,因为它能够预先计算出最终结果的长度,从而一次性分配正确长度的字符串。但这只是证明概念以及如何组合多种奇特的技术。)

关于arrays - 尽可能使用 `Iterator` 而不是 `Vec`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31442254/

相关文章:

javascript - 在数组中找到匹配项并用 jQuery 替换它

c++ - Accelerated C++,问题 5-6(将 vector 内部的值复制到前面)

python - 如何将项目添加到Python列表中的字符串

C++ 使用 const 数组和 initializer_list 重载构造函数

java - 如何在 Java 中将变量的值添加到数组中?

c++ - 带 POD C++ 的 std::vector::emplace_back

c++ - 双 vector 以保存多边形中每一边的距离

c++ - 使用迭代器遍历 boost::ublas 矩阵

java - 迭代列表的最佳方法是什么

php数组 - 大写或小写