Rust中如何从数组b构建条件表达式,用于数组a的遍历循环?
如何用数组b构建Rust中的整除判断表达式?
嘿,这个需求很清晰——你想基于数组b里的元素,生成一个类似(i % 3 == 0) || (i % 5 == 0) || (i % 7 == 0)的条件逻辑,用来在遍历数组a时判断每个元素是否满足整除条件对吧?我给你分两种场景来解决:
场景1:数组b是编译期固定的
如果b的元素是写死的(就像你例子里的vec![3,5,7]),我们可以用Rust的宏来帮我们编译时直接展开成目标表达式,完全符合你想要的形式:
macro_rules! generate_divisibility_check { ($($divisor:expr),+) => { |i: u32| { // 宏会把传入的每个除数展开成`i%x==0`,并用||连接 $(i % $divisor == 0)||+ } }; } fn main() { let a: Vec<u32> = vec![80, 90, 101, 254]; let b: Vec<u32> = vec![3, 5, 7]; // 直接把b的元素传给宏生成判断闭包 let is_divisible = generate_divisibility_check!(3, 5, 7); for i in a { if is_divisible(i) { println!("{} is true", i); } } }
这个宏展开后,is_divisible对应的逻辑就是|i| (i%3==0) || (i%5==0) || (i%7==0),和你想要的完全一致,而且编译时就完成了展开,运行时没有额外的遍历开销。
场景2:数组b是运行时动态的
如果b的元素是动态生成的(比如从用户输入读取、数据库查询获取),那没法生成静态的表达式,但我们可以用闭包捕获b,在每次判断时动态检查:
fn main() { let a: Vec<u32> = vec![80, 90, 101, 254]; let b: Vec<u32> = vec![3, 5, 7]; // 闭包捕获b的所有权,用any()遍历检查是否有能整除的除数 let is_divisible = move |i: u32| { b.iter().any(|&divisor| i % divisor == 0) }; for i in a { if is_divisible(i) { println!("{} is true", i); } } }
这里的any()方法会遍历b的每个元素,只要有一个元素能整除i就返回true,效果和||连接的表达式完全一样,而且支持任意动态的b数组。
内容的提问来源于stack exchange,提问作者Scott DeJong
相关产品推荐
相关产品推荐

