从单个元素创建迭代器

awe*_*kie 9 rust

我想在迭代器中添加一个元素.具体来说,我想创建一个迭代器,逐步完成序列[2,3,5,7,9,...].我能想到的最好的是

range_step_inclusive(2,2,1).chain(range_step_inclusive(3, max, 2))
Run Code Online (Sandbox Code Playgroud)

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

CAD*_*D97 9

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

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

这通常用于将单个值调整为其他类型迭代的链().也许你有一个几乎覆盖所有东西的迭代器,但你需要一个额外的特殊情况.也许你有一个可以在迭代器上运行的函数,但是你只需要处理一个值.

当然,range_step_inclusive 早已不复存在.有step_by其是B-不稳定和夜间P-介质.(相同的SO线程链接包含一个稳定的反向填充.)因为我无论如何都在夜间使用,所以我们也使用包含范围语法(..=),它正朝着稳定化方向发展(评论)

所以,

iter::once(2).chain((3..=max).step_by(2))
Run Code Online (Sandbox Code Playgroud)


aoc*_*via 5

它不是样板,但我想它更清楚:

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

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

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


huo*_*uon 5

您可以使用Option按值迭代器,move_iter

Some(2i).move_iter().chain(iter::range_step_inclusive(3i, max, 2))
Run Code Online (Sandbox Code Playgroud)

围栏

  • 现在是into_iter吗? (2认同)
  • 是的,它已重命名。 (2认同)