rust - 是否可以连接迭代器?
问题描述
let vec = iter::repeat("don't satisfy condition 1") // iterator such as next() always "don't " satisfy condition 1"
.take_while(|_| {
satisfycondition1.satisfy() // true is condition 1 is satisfied else false
})
.collect();
此代码创建一个n
元素向量,该向量n
等于不遵守条件 1 的次数。
我现在想创建一个n + m
元素向量,其n
等于不遵守条件 1m
的次数和不遵守条件 2 的次数。
代码应该类似于这样:
let vec = iter::repeat("dont't satisfy condition 1")
.take_while(|_| {
satisfycondition1.satisfy()
})
.union(
iter::repeat("has satisfed condition 1 but not 2 yet")
.take_while(|_| {
satisfycondition2.satisfy()
})
)
.collect();
我知道我可以创建两个向量,然后将它们连接起来,但效率较低。
您可以使用此代码来了解重复的内容:
use std::iter;
fn main() {
let mut c = 0;
let z: Vec<_> = iter::repeat("dont't satisfy condition 1")
.take_while(|_| {
c = c + 1;
let rep = if c < 5 { true } else { false };
rep
})
.collect();
println!("------{:?}", z);
}
解决方案
这似乎std::iter::chain
是您正在寻找的东西。
use std::iter;
fn main() {
let mut c = 0;
let mut d = 5;
let z: Vec<_> = iter::repeat("don't satisfy condition 1")
.take_while(|_| {
c = c + 1;
let rep = if c < 5 { true } else { false };
rep
// this block can be simplified to
// c += 1;
// c < 5
// Clippy warns about this
})
.chain(
iter::repeat("satisfy condition 1 but not 2").take_while(|_| {
d -= 1;
d > 2
}),
)
.collect();
println!("------{:?}", z);
}
不过,我无法评论您的代码的语义。如果您试图查看迭代器的哪些元素“满足条件 1 但不满足条件 2”,那么您不会这样做。您将使用std::iter::filter
两次(一次使用条件 1,一次使用非条件 2)来实现这一目标。
推荐阅读
- magento-1.9 - 折扣价格消失一段时间
- javascript - 使用 JavaScript 在移动浏览器虚拟键盘中自定义 Enter 键
- ruby-on-rails - 在 Ruby 代码中获取 window.location.hostname
- php - 如何使用 ajax 和 php 制作删除功能
- azure - 从特性创建 PR 到开发分支时,PR 触发器如何工作?构建是否在目标分支触发
- ios - 从字节中获取位的值 | 斯威夫特 5
- intellij-idea - 如何在与 Wildfly 和 IntelliJ 的战争中启用依赖 jar 的资源热交换?
- c++ - 解析字符串 - 无法确定如何分隔连接的单词
- java - 如何使用 lucene 索引创建 RDBMS 橡树存储库
- r - 我无法在 R Shiny 中设置数据表列宽