以下代码
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)
这方面甚至可能有数学基础,但我找不到快速的东西.
如果您对数学基础感兴趣,这里有一个简短的证明:
语句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为真。
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |