如何使用 Ord::max 函数?

Nay*_*uki 2 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);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到一个神秘的编译时错误:

fn main() {
    let a: i32 = 0;
    let b: i32 = 1;
    let c: i32 = a.max(b);  // <-- Error here
    println!("{}", c);
}
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我正在使用 Rust 1.17.0。

如何使用max()(或min())函数?

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

let a: f32 = 0.0;
let b: f32 = 1.0;
let c: f32 = a.max(b);
Run Code Online (Sandbox Code Playgroud)

这让事情变得更加神秘。

DK.*_*DK. 6

它适用于更新的编译器。您可以通过在婴儿围栏上尝试来了解这一点。

问题是你试图调用一个不存在的方法。至少,不是在您使用的 Rust 版本中。在对文档Ord::max指出,它在鲁斯特版本1.21.0介绍。

你想要的是使用cmp::max,这是一个函数,而不是一个方法。因此,您可以这样称呼它:

use std::cmp;
let c = cmp::max(a, b);
Run Code Online (Sandbox Code Playgroud)

至于为什么它适用于f32,可以通过查看文档找到答案:搜索max揭示了这一点f32f64拥有自己的max方法版本。而这是因为两者cmp::maxOrd::max只对具有全序类型的工作。由于 NaN 的存在,浮点数不是完全有序的,因此它们不能使用其中任何一个。