我怎样才能使用Ord :: max函数?

时间:2017-11-06 05:54:26

标签: compiler-errors rust

在这个简单的程序中,我尝试拨打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。

如何使用max()(或min())功能?

如果我使用浮点值,该示例有效:

let a: f32 = 0.0;
let b: f32 = 1.0;
let c: f32 = a.max(b);

这让事情变得更加神秘。

2 个答案:

答案 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显示f32f64有自己的版本一个max方法。并且那是因为cmp::maxOrd::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);
}