ram*_*mbi 2 iteration combinations boolean rust
我有一个foo需要 3 个布尔值的函数,我想用每个布尔值组合来获得这个函数的结果。
这是我如何做到的:
fn foo(b1: bool, b2: bool, b3: bool) -> bool {
b1 && b2 || !b3
}
fn main() {
for b1 in vec![false, true] {
for b2 in vec![false, true] {
for b3 in vec![false, true] {
println!("{} {} {} -> {}", b1, b2, b3, foo(b1, b2, b3));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有比创建向量然后迭代它更直接/更短的方法?
有没有办法用宏或可变函数来做到这一点,这样编译器就可以不迭代地遍历每种情况?
您可以使用itertools板条箱,然后使用iproduct!()宏。
use itertools::iproduct;
fn main() {
const FT: &[bool; 2] = &[false, true];
for (&b1, &b2, &b3) in iproduct!(FT, FT, FT) {
println!("{} {} {} -> {}", b1, b2, b3, foo(b1, b2, b3));
}
}
Run Code Online (Sandbox Code Playgroud)
不是说它“更有效”,但写起来更短。
至少你可以使用数组而不是向量,从而保存动态分配:
fn foo(b1: bool, b2: bool, b3: bool) -> bool {
b1 && b2 || !b3
}
fn main() {
for b1 in &[false, true] {
for b2 in &[false, true] {
for b3 in &[false, true] {
println!("{} {} {} -> {}",
b1, b2, b3,
foo(*b1, *b2, *b3));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用itertools::iproduct!以下方法节省循环嵌套:
use itertools::iproduct; // 0.9.0
fn foo(b1: bool, b2: bool, b3: bool) -> bool {
b1 && b2 || !b3
}
fn main() {
for (&b1, &b2, &b3) in iproduct!(&[false, true], &[false, true], &[false, true]) {
println!("{} {} {} -> {}",
b1, b2, b3,
foo(b1, b2, b3));
}
}
Run Code Online (Sandbox Code Playgroud)