gpt4 book ai didi

rust - 过滤迭代器中与模式匹配的值的惯用方式

转载 作者:行者123 更新时间:2023-12-03 11:44:48 28 4
gpt4 key购买 nike

在下面的示例(here is the Rust playground)中,我需要在迭代器中过滤与特定模式匹配的值。
我发现的一种方法是使用match返回Option中的filter_map:

#[derive(Copy, Clone, Debug)]
struct Entity(i32);

enum Event {
EntityInserted(Entity),
EntityRemoved(Entity),
}

fn main() {
let [entity1, entity2] = [Entity(1), Entity(2)];

let events = vec![
Event::EntityInserted(entity1),
Event::EntityRemoved(entity1),
Event::EntityInserted(entity2),
];

let inserted_entities: Vec<_> = events
.iter()
.filter_map(|event| match event { // <---
Event::EntityInserted(entity) => Some(entity), // <--- Those lines
_ => None, // <--- here
}) // <---
.collect();

dbg!(inserted_entities);
}
有一种更惯用的方式来发生这种行为吗?

最佳答案

至于filter_map,我认为这是要走的路。
奇怪的是,我昨天写了一个宏,如果Some是“successful”,则生成一个if,否则计算为None:

macro_rules! if_then_some {
($cond: expr, $val: expr) => {
if $cond { Some($val) } else { None }
};
(let $pattern:pat = $expr: expr, $val: expr) => {
if let $pattern = $expr { Some($val) } else { None }
};
}
就目前而言,它可用于检查 bool -conditions和 if let -conditions。在您的情况下,可以使用 like this:
let inserted_entities: Vec<_> = events
.iter()
.filter_map(|event|
if_then_some!(let Event::EntityInserted(entity)=event, entity)
)
.collect();
如果这是“惯用的”,这是有争议的,但是恕我直言,它简洁而又易读。
有点题外话:另一方面,每当我看到 if let带有 OptionResult以外的其他内容时,我很警惕如果我添加了在这种情况下应检查的新变体,则编译器不会警告我。

关于rust - 过滤迭代器中与模式匹配的值的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63644071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com