首页 > 解决方案 > Rust 中的两个引用变量如何相等?

问题描述

我的代码在其中一个功能中有错误:

fn is_five(x: &i32) -> bool {
    x == 5
}

fn main() {
    assert!(is_five(&5));
    assert!(!is_five(&6));
    println!("Success!");
}

运行时,错误是:

error[E0277]: can't compare `&i32` with `{integer}`
 --> main.rs:2:7
  |
2 |     x == 5
  |       ^^ no implementation for `&i32 == {integer}`
  |
  = help: the trait `std::cmp::PartialEq<{integer}>` is not implemented for `&i32`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

我通过比较两个值而不是一个地址和一个值的逻辑来修复它。

fn is_five(x: &i32) -> bool {
    *x == 5
}

但是,我也尝试(随机)使用借用方法,令我惊讶的是,它奏效了。

fn is_five(x: &i32) -> bool {
    x == &5
}

我不明白两个地址怎么可能相同?是否该==运算符具有某些特性可以获取存储在两端的值?

标签: rust

解决方案


要想能做到==,就必须落实PartialEq。如果您查看此处的文档,您可以看到如果一个类型A实现PartialEq<B>然后&'_ A实现PartialEq<&'_ B>。换句话说,如果您可以比较值,则可以使用引用进行比较。

相同的推理适用于其他比较特征:Eq,PartialOrdOrd, 以及可变引用。


推荐阅读