Rust遍历数组检查子对象文本存在的问题(Shopify支付定制场景)
Shopify支付扩展:判断配送选项标题的Rust实现方案
问题核心
遍历cart.deliveryGroups,检查是否存在任意一个配送组的selectedDeliveryOption的title等于"Test",存在返回true,否则返回false。
错误原因
你用到的option_result_contains是Rust的不稳定特性,对应Option::contains或Result::contains这类未稳定的方法,稳定版Rust环境下无法编译。
正确的稳定迭代实现
先假设你的数据结构与Shopify支付扩展的常见结构匹配(需对齐你的实际定义):
#[derive(Debug)] struct Cart { delivery_groups: Vec<DeliveryGroup>, } #[derive(Debug)] struct DeliveryGroup { selected_delivery_option: Option<DeliveryOption>, } #[derive(Debug)] struct DeliveryOption { title: String, }
标准写法(短路求值,效率最优)
fn has_test_delivery_option(cart: &Cart) -> bool { cart.delivery_groups.iter().any(|group| { group.selected_delivery_option.as_ref().map_or(false, |option| { option.title == "Test" }) }) }
关键细节
iter().any():遍历过程中只要找到符合条件的项就立即返回,避免不必要的遍历。as_ref():获取Option的引用,避免转移所有权导致的编译错误。map_or(false, ...):处理None的情况(无选中配送选项时返回false),Some时检查标题是否匹配。
替代实现方式
模式匹配写法(更直观)
fn has_test_delivery_option(cart: &Cart) -> bool { cart.delivery_groups.iter().any(|group| { match &group.selected_delivery_option { Some(option) => option.title == "Test", None => false, } }) }
链式调用写法(简洁易读)
fn has_test_delivery_option(cart: &Cart) -> bool { cart.delivery_groups .iter() .filter_map(|group| group.selected_delivery_option.as_ref()) .any(|option| option.title == "Test") }
filter_map:自动过滤掉None的配送选项,只保留有效选项的引用,再通过any检查标题。
调试技巧
如果仍有问题,可打印配送组的详细信息排查:
fn debug_delivery_options(cart: &Cart) { for (idx, group) in cart.delivery_groups.iter().enumerate() { println!("配送组 {}: {:?}", idx, group.selected_delivery_option); } }
调用该函数可确认selectedDeliveryOption是否存在,以及title的实际值是否符合预期。
内容的提问来源于stack exchange,提问作者santhoshnsscoe
相关产品推荐
相关产品推荐

