【问题标题】:Create an iterator from a single element从单个元素创建迭代器
【发布时间】:2014-07-18 17:53:40
【问题描述】:

我想在迭代器前添加一个元素。具体来说,我想创建一个迭代器,它逐步遍历序列 [2, 3, 5, 7, 9, ...] 直到某个最大值。我能想到的最好的是

range_step_inclusive(2,2,1).chain(range_step_inclusive(3, max, 2))

但是第一个迭代器是一种将单个元素 2 作为迭代器的 hack。是否有更惯用的方法来创建单元素迭代器(或将元素添加到迭代器)?

【问题讨论】:

    标签: rust


    【解决方案1】:

    这是std::iter::once 的确切用例。

    创建一个只产生一次元素的迭代器。

    这通常用于将单个值调整为其他类型迭代的chain。也许您有一个几乎涵盖所有内容的迭代器,但您需要一个额外的特殊情况。也许您有一个适用于迭代器的函数,但您只需要处理一个值。

    range_step_inclusiveis long gone,所以我们也使用inclusive range syntax..=):

    iter::once(2).chain((3..=max).step_by(2))
    

    【讨论】:

      【解决方案2】:

      你可以使用the Option by-value iterator, into_iter:

      Some(2).into_iter().chain((3..).step_by(2))
      

      【讨论】:

      • 现在是 into_iter 吗?
      • 是的,改名了。
      【解决方案3】:

      样板文件不多,但我想它更清楚:

      Repeat::new(2i).take(1).chain(range_step_inclusive(3, max, 2))

      Repeat::new 将根据您提供的值创建一个无限迭代器。 Take 将只产生该迭代器的第一个值。其余的都不是什么新鲜事了。

      您可以通过以下链接在 playpen 上运行此示例:http://is.gd/CZbxD3

      【讨论】:

        猜你喜欢
        • 2016-07-22
        • 1970-01-01
        • 2016-07-24
        • 2019-06-23
        • 2019-06-06
        • 1970-01-01
        • 2018-05-20
        • 2012-12-07
        • 1970-01-01
        相关资源
        最近更新 更多