为什么Iterator :: all对于空迭代器都返回true?

Mal*_*ice 7 rust

以下代码

fn main() {
    {
        let a: Vec<i32> = vec![1, 2, 3, 4];
        print!("{}\n", a.into_iter().all(|x| x > 1));
    }
    {
        let a: Vec<i32> = vec![];
        print!("{}\n", a.into_iter().all(|x| x > 1));
    }
}
Run Code Online (Sandbox Code Playgroud)

给了我输出

false
true
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,当空的时候a.into_iter().all(|x| x > 1)返回.truea

查看文档Iterator::all,我看到明确说明:

空迭代器返回true.

为什么选择这样?

Seb*_*edl 12

这是all几乎所有编程语言中函数的典型约定,除了那些错误的函数.相反,any返回false空序列.

原因是它对典型场景更有用.如果您有一个需求列表,并且值必须满足所有这些要通过过滤器.如果您的列表实际上是空的,那么值是否应该通过?通常最有意义的答案是肯定的.因此,conditions.all(|value| condition.fulfilled(value))返回true空列表.

这也是all定义重新定义的自然结果,"没有项目是假的",如果你all以直观的方式实现,则默认为:

fn all<F>(&mut self, f: F) -> bool
where
    F: FnMut(Self::Item) -> bool,
{
    for v in self {
        if !f(v) {
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这方面甚至可能有数学基础,但我找不到快速的东西.

  • `all`基本上用`&&'折叠,因为'&&`的标识元素是'true`,它是`all`返回的.另一方面,`any`是带有`||'的折叠,而`||`的标识是'false`. (2认同)

Gui*_*ris 7

如果您对数学基础感兴趣,这里有一个简短的证明:

语句A => B(A 暗示 B)在逻辑上等价于!A | B(不是 A 或 B)。

语句S: for each x in X, P(x) is true(其中 P 是谓词)是 的简写for each x: x in X implies P(X) is true

因此,该语句等价于:For each x: P(x) is true or x is not in X

如果X为空,则该语句x is not in X始终为真,因此该语句S为真。