迭代 [false, true] 的最有效方法是什么?

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)

有没有比创建向量然后迭代它更直接/更短的方法?

有没有办法用宏或可变函数来做到这一点,这样编译器就可以不迭代地遍历每种情况?

Val*_*tin 8

您可以使用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)

不是说它“更有效”,但写起来更短。


Seb*_*edl 5

至少你可以使用数组而不是向量,从而保存动态分配:

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)

(操场)