我理解why the floats don't have an implementation for Ord,但当我想懒惰和使用迭代器时,这对我并没有特别的帮助.

是否有一种解决方法或简单的方法来获取包含浮点数的迭代器的最小/min/min_?

我知道一个人可以进行排序(这很慢),或者用另一种类型进行包装,并实现所需的交易(这很冗长),但我希望有更优雅的东西.

推荐答案

float有自己的minmax个方法,可以一致地处理NaN,因此可以折叠迭代器:

use std::f64;

fn main() {
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN];

    let min = x.iter().fold(f64::INFINITY, |a, &b| a.min(b));
    println!("{}", min);
}

打印-10张.

如果需要不同的NaN处理,可以使用PartialOrd::partial_cmp.例如,如果您希望传播NAN,请使用:

use std::f64;
use std::cmp::Ordering;

fn main() {
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN];

    let min = x.iter().fold(f64::INFINITY, |a, &b| {
        match PartialOrd::partial_cmp(&a, &b) {
            None => f64::NAN,
            Some(Ordering::Less) => a,
            Some(_) => b,
        }
    });
    println!("{}", min);
}

Rust相关问答推荐

预期 struct VecDeque Student发现 struct VecDeque Student(Student)

什么是谓词的简短和简洁类型

如何在tauri—leptos应用程序中监听后端值的变化?""

Arrow RecordBatch as Polars DataFrame

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

在Rust中赋值变量有运行时开销吗?

值为可变对象的不可变HashMap

通过使用光标拖动角来绕其中心旋转矩形

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

为什么TcpListener的文件描述符和生成的TcpStream不同?

在Rust中声明和定义一个 struct 体有什么区别

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

返回优化后的标题:返回异步块的闭包的类型擦除

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

有没有办法通过命令获取 Rust crate 的可安装版本列表?

如何使用泛型满足 tokio 异步任务中的生命周期界限

为什么数组不像向量那样在 for 块之后移动?

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

如何重写这个通用参数?