如何从Rust的f64类型数组中获取绝对值最大值
Rust中获取f64数组的绝对值最大值的简洁实现
问题场景
有如下定义的f64类型数组:
let arr: Vec<f64> = vec![1.5, 1.1, -1.6, 0.9, -0.5];
需要获取该数组中绝对值最大的元素(期望输出-1.6或1.6,而非1.5),希望用简洁的内联方式实现,而非手动编写遍历比较函数。
尝试的代码及错误
尝试了以下代码:
let abs_max = arr.iter().max_by(|a, b| a.abs().total_cmp(b.abs()))
但编译报错:
error[E0599]: no method named `abs` found for reference `&&{float}` in the current scope --> src\main.rs:51:44 | 51 | let abs_max = arr.iter().max_by(|a, b| a.abs().total_cmp(b.abs())); | ^^^ method not found in `&&{float}` error[E0599]: no method named `abs` found for reference `&&{float}` in the current scope --> src\main.rs:51:62 | 51 | let abs_max = arr.iter().max_by(|a, b| a.abs().total_cmp(b.abs())); | ^^^ method not found in `&&{float}`
错误原因
arr.iter()返回的是&f64类型的迭代器,而max_by闭包的参数a、b是迭代器元素的引用,也就是&&f64类型。abs()方法是为f64和&f64实现的,但没有为&&f64实现,因此直接调用会报错。
解决方案
方案1:解引用闭包参数
通过解引用获取底层的f64值,再调用abs(),同时注意total_cmp需要接收&f64参数:
// 显式解引用写法 let abs_max = arr.iter().max_by(|a, b| (*a).abs().total_cmp(&(*b).abs())); // 利用Rust自动解引用特性简化 let abs_max = arr.iter().max_by(|a, b| a.abs().total_cmp(&b.abs()));
方案2:转换迭代器元素为所有权类型
使用cloned()将迭代器从&f64转换为f64,此时闭包参数为&f64,可以直接调用abs():
let abs_max = arr.iter().cloned().max_by(|a, b| a.abs().total_cmp(&b.abs()));
方案3:借助外部crate简化(可选)
如果允许引入外部依赖,可以使用ordered-float crate中的OrderedFloat类型,配合max_by_key实现更简洁的写法:
首先在Cargo.toml中添加依赖:
[dependencies] ordered-float = "3.0"
然后编写代码:
use ordered_float::OrderedFloat; let abs_max = arr.iter().max_by_key(|&x| OrderedFloat(x.abs()));
最终使用示例
上述方法返回的都是Option<&f64>(或Option<f64>,方案2),可以通过模式匹配或unwrap取出值:
if let Some(max_val) = abs_max { println!("{}", max_val); // 输出-1.6 }
内容的提问来源于stack exchange,提问作者Ólavur Nón
相关产品推荐
相关产品推荐

