Rust - 创建过滤谓词作为函数

Posted

技术标签:

【中文标题】Rust - 创建过滤谓词作为函数【英文标题】:Rust - create filter predicate as function 【发布时间】: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&lt;dyn Iterator&lt;Item = ...&gt;&gt; 类型,并在每次迭代中创建一个新框。 您也可以随时收集到一个新的Vec 一次,然后修改该向量。 【参考方案1】:

如果没有完整的minimal reproducible example,很难给出完整的答案,但您可以通过对代码进行两项更改来接近:

如果要在filter 中使用谓词,则必须返回bool。 可能,谓词必须采用&amp;&amp;str

工作示例:

fn create_predicate(character: char, n: usize) -> impl FnMut(&&str) -> bool 
    move |x: &&str| 
        return x.chars().collect::<Vec<char>>().get(n).unwrap() == &character;
    


fn main() 
    let co2 = [ "azerty", "foo", "bar" ];
    let co2 = co2.iter().copied().filter(create_predicate('q', 1));

Playground

【讨论】:

对不起我的例子。在过滤之前运行copied()有什么原因吗? 如果没有copied,谓词需要采用&amp;&amp;&amp;str,否则它应该可以工作。

以上是关于Rust - 创建过滤谓词作为函数的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate的使用

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

如何创建一个谓词,其中 % 在 ios 中作为字符串工作

如果xargs是map,那么什么是过滤器?

附加 QueryDSL 谓词或基于过滤器值构建谓词