【发布时间】:2022-01-09 19:50:43
【问题描述】:
我想创建一个返回谓词的函数。
我有一个向量,我想根据字符过滤特定字符。我的代码:
let n = 0; // Irrelevant. This will change
co2 = co2
.into_iter()
.filter(|&binary| binary.chars().collect::<Vec<char>>().get(n).unwrap() == &'1')
.collect();
我有几个要匹配的字符。我的意图是创建一个这样的函数:
fn create_predicate(character: char, n: usize) -> impl FnMut(&str) {
move |x: &str| {
return x.chars().collect::<Vec<char>>().get(n).unwrap() == &character;
}
}
co2 = co2.filter(create_predicate('q', n));
这行不通,但我想让它看起来像那样
所以我想要一个函数来创建一个可以在我的过滤器中使用的谓词。我该怎么做?
【问题讨论】:
-
旁注:你不想在这里
Iterator::filter()。你实际上想要Vec::retain()。 -
感谢您的评论@SvenMarnach。我认为有比做我所做的更好的方法。这将改变向量。在我的用例中,没关系。但是如果你想让它不可变怎么办?
-
co2 = co2.filter(...)的问题是左侧的类型与右侧的类型不同,因此这在静态类型语言中不起作用。如果您想要以动态次数迭代地使用filter(),则需要模拟动态类型。您可以尝试使用Box<dyn Iterator<Item = ...>>类型,并在每次迭代中创建一个新框。 -
您也可以随时收集到一个新的
Vec一次,然后修改该向量。