在这个简单的程序中,我尝试拨打i32.max(i32)
:
fn main() {
let a: i32 = 0;
let b: i32 = 1;
let c: i32 = a.max(b); // <-- Error here
println!("{}", c);
}
但是我得到了一个神秘的编译时错误:
error: no method named `max` found for type `i32` in the current scope
--> prog.rs:4:17
|
4 | let c: i32 = a.max(b);
| ^^^
|
= note: the method `max` exists but the following
trait bounds were not satisfied: `i32 : std::iter::Iterator`
为什么会这样?我使用的是Rust 1.17.0。
如果我使用浮点值,该示例有效:
let a: f32 = 0.0;
let b: f32 = 1.0;
let c: f32 = a.max(b);
这让事情变得更加神秘。
答案 0 :(得分:4)
使用更新的编译器可以正常工作。你可以通过trying it on the playpen看到这个。
问题是您正在尝试调用不存在的方法 。至少,不是你正在使用的Rust版本。 documentation for Ord::max
注意到它是在Rust 1.21.0版本中引入的。
你想要的是使用cmp::max
,这是一个函数,不是方法。因此,你这样称呼它:
use std::cmp;
let c = cmp::max(a, b);
至于它适用于f32
的原因,可以通过查看文档找到答案:a search for max
显示f32
和f64
有自己的版本一个max
方法。并且那是因为cmp::max
和Ord::max
仅适用于具有总排序的类型。由于存在NaN,浮点数不完全有序,所以他们不能使用其中任何一个。
答案 1 :(得分:-2)
如果你想比较数字,你可以这样做:
use std::cmp;
fn main() {
let a: i32 = 0;
let b: i32 = 1;
let c: i32 = cmp::max(a, b);
println!("{}", c);
}