rust中的引用为什么可以直接比较大小

Rust 中两个引用(如 &T)可以直接比较大小,是因为 Rust 的标准库为实现了 Ord 或 PartialOrd trait 的类型 T 的引用类型 &T 自动实现了这些 trait。具体来说,当比较 &a 和 &b 时,实际上是在比较它们所指向的底层数据 a 和 b 的值

原因有以下两点:
1. 智能隐式解引用(Dereferencing): Rust 的比较运算符(<, >, <=, >=)会处理引用。编译器在比较时,会自动深入引用层级,比较指向的实际数值,而非引用本身的内存地址。

2. Trait 自动实现: Rust 标准库中存在类似 impl Ord for &T 的定义。即如果类型 T 本身是可以比较顺序的(实现了 Ord),那么 &T 也自动拥有比较顺序的能力。

或者这么来理解: 在 Rust 中,比较运算符(如 >, <, ==)实际上是对标准库中 Trait(特征)的语法糖。比如 > 对应的是 PartialOrd 这个特征(Trait), 如果一个类型 T 可以比较大小,那么它的引用 &T 也可以比较大小;并且,比较两个引用时,Rust 会自动去比较它们所指向的底层数据。

所以,只要引用指向的类型实现了 PartialOrd(如整数、浮点数、字符串等),引用之间就能直接比较。

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let mut largest = &number_list[0];

    for number in &number_list {
        if number > largest {
            largest = number;
        }
    }

    println!("The largest number is {largest}");
}

中 if number > largest 改成 *number > *largest 也是可以的。 这就是手动解引用。

如果我真的想比较引用的“内存地址”怎么办?
因为 Rust 默认比较引用是指向的值,如果你在某些极少数的底层场景下,真的想要比较两个变量是不是存放在内存的同一个位置(比较地址大小),你需要把它们转换成裸指针(Raw Pointers):

if (number as *const i32) > (largest as *const i32)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注