rust - 如何检查两个引用变量是否借用了同一个对象?
问题描述
我有一个所有存储只读引用的结构,例如:
struct Pt { x : f32, y : f32, }
struct Tr<'a> { a : &'a Pt }
我想impl Eq
测试Tr
底层a
引用是否完全相同Pt
:
let trBase1 = Pt::new(0.0, 0.0);
let trBase2 = Pt::new(0.0, 0.0);
assert!(trBase1 == trBase2); // ok.
let tr1 = Tr::new(&trBase1);
let tr2 = Tr::new(&trBase2);
let tr3 = Tr::new(&trBase1);
assert!(tr1 == tr3); // ok.
assert!(tr1.a == te2.a); // ok. Using Eq for Pt that compare values.
assert!(tr1 != tr2); // panicked! Not intended.
所以现在我有
impl<'a> PartialEq for Tr<'a> {
fn eq(&self, v : &Tr<'a>) -> bool {
// self.a == v.a // doesn't work.
}
}
我应该写什么?
解决方案
您可以使用std::ptr::eq
比较两个指针的地址。如果提供给此函数,引用 (&T
或&mut T
) 将自动强制转换为基础指针 ( )。*const T
当然,可变引用与另一个引用具有相同的地址是没有意义的,因为可变引用总是排他引用,但它仍然可以被强制转换为*const T
.
// This derive will use the equality of the underlying fields
#[derive(PartialEq)]
struct Pt {
x: f32,
y: f32,
}
impl Pt {
fn new(x: f32, y: f32) -> Self {
Self { x, y }
}
}
struct Tr<'a> {
a: &'a Pt,
}
impl<'a> Tr<'a> {
fn new(a: &'a Pt) -> Self {
Self { a }
}
}
// Here we use std::ptr::eq to compare the *addresses* of `self.a` and `other.a`
impl<'a> PartialEq for Tr<'a> {
fn eq(&self, other: &Tr<'a>) -> bool {
std::ptr::eq(self.a, other.a)
}
}
fn main() {
let tr_base1 = Pt::new(0.0, 0.0);
let tr_base2 = Pt::new(0.0, 0.0);
assert!(tr_base1 == tr_base2);
let tr1 = Tr::new(&tr_base1);
let tr2 = Tr::new(&tr_base2);
let tr3 = Tr::new(&tr_base1);
assert!(tr1 == tr3);
assert!(tr1.a == tr2.a);
assert!(tr1 != tr2);
}
推荐阅读
- php - 带递归的 PDO 查询
- django - 清理表单和访问 self.instance.user 时的 Django RelatedObjectDoesNotExist
- html - html小标签在h1标签内不起作用
- rest - 如何更改 Microsoft.OData.Client.DataServiceContext 中实体的状态?
- reactjs - Laravel 护照仅适用于初始加载
- php - 在 php 中进行实时搜索,mysqli_stmt_close 出现错误
- python - 运行 grpc python 示例必须使用 sudo 命令
- mongodb - Mongodb文本搜索聚合执行问题
- javascript - 如何正确使用forkJoin
- javascript - “name”属性可以用于自定义 VueJS 组件吗