我的代码在其中一个函数中存在错误:
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
}
我不明白两个地址怎么可以相同?是否该==运算符有某种特征可以获取两端存储的值?
要想做到==,就必须落实PartialEq。如果您查看此处的文档,您可以看到如果类型A实现了PartialEq<B>则&'_ A实现PartialEq<&'_ B>。换句话说,如果可以比较值,则可以使用引用来比较它们。
同样的推理适用于其他比较特征:Eq、PartialOrd、 和Ord,以及可变引用。
| 归档时间: | 
 | 
| 查看次数: | 2410 次 | 
| 最近记录: |