rust - 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
}
我不明白两个地址怎么可能相同?是否该==
运算符具有某些特性可以获取存储在两端的值?
解决方案
要想能做到==
,就必须落实PartialEq
。如果您查看此处的文档,您可以看到如果一个类型A
实现PartialEq<B>
然后&'_ A
实现PartialEq<&'_ B>
。换句话说,如果您可以比较值,则可以使用引用进行比较。
相同的推理适用于其他比较特征:Eq
,PartialOrd
和Ord
, 以及可变引用。
推荐阅读
- java - 如何在 Java 中转换儒略日期(序数日期)
- abap - 删除 cl_gui_alv_grid 的 ALV Scrren 中的执行按钮 (ONLI)
- r - 结合 renderUI、dataTableOutput、renderDataTable 和响应式以允许用户从列表或 DT 中进行选择
- git - 拉总是会导致冲突。(GIT)
- r - 关于使用 lm() 函数的错误(在 R 中)
- java - com.sparsh.conferencedemo.controllers.SessionController 中的 sessionRepository 需要一个找不到的 bean
- reactjs - 在我的网络中,当我多次单击“保存”按钮时,它会保存很多。有什么解决办法吗?作为 React Js
- axios - axios:如何在axios中获取数据
- css - 我的引导卡隐藏在侧栏下
- php - laravel,mysql事务一旦回滚就不起作用