为什么 Rust 不让我比较 Foo 和 &Foo?
Why doesn't Rust let me compare a Foo and an &Foo?
据我了解,引用之间的相等性比较比较的是引用对象的值,而不是引用中包含的地址。即他们隐含地取消引用引用。
既然如此,为什么还要写:
if ref_to_foo == &another_foo {
而不是
if ref_to_foo == another_foo {
当
if ref_to_foo == ref_to_another_foo {
双方已经隐式取消引用了吗?
显而易见的答案是“因为编译器造就了我”,但我试图理解为什么语言设计者认为这是一个坏主意。
当写a==b
时,编译器理解PartialEq::eq(&a, &b)
。
因此,当写&a==&b
时,编译器理解PartialEq::eq(&&a, &&b)
。
This documentation 导致此源代码
impl<A: ?Sized, B: ?Sized> PartialEq<&B> for &A
where
A: PartialEq<B>,
{
#[inline]
fn eq(&self, other: &&B) -> bool {
PartialEq::eq(*self, *other)
}
#[inline]
fn ne(&self, other: &&B) -> bool {
PartialEq::ne(*self, *other)
}
}
显示 PartialEq::eq(&&a, &&b)
的实现只是取消引用参数,以便将调用转发给 PartialEq::eq(&a, &b)
(因此,最终与 a==b
相同)。
似乎不存在仅取消引用两个参数之一的 PartialEq
的任何默认实现,因此应拒绝 a==&b
和 &a==b
。
据我了解,引用之间的相等性比较比较的是引用对象的值,而不是引用中包含的地址。即他们隐含地取消引用引用。
既然如此,为什么还要写:
if ref_to_foo == &another_foo {
而不是
if ref_to_foo == another_foo {
当
if ref_to_foo == ref_to_another_foo {
双方已经隐式取消引用了吗?
显而易见的答案是“因为编译器造就了我”,但我试图理解为什么语言设计者认为这是一个坏主意。
当写a==b
时,编译器理解PartialEq::eq(&a, &b)
。
因此,当写&a==&b
时,编译器理解PartialEq::eq(&&a, &&b)
。
This documentation 导致此源代码
impl<A: ?Sized, B: ?Sized> PartialEq<&B> for &A
where
A: PartialEq<B>,
{
#[inline]
fn eq(&self, other: &&B) -> bool {
PartialEq::eq(*self, *other)
}
#[inline]
fn ne(&self, other: &&B) -> bool {
PartialEq::ne(*self, *other)
}
}
显示 PartialEq::eq(&&a, &&b)
的实现只是取消引用参数,以便将调用转发给 PartialEq::eq(&a, &b)
(因此,最终与 a==b
相同)。
似乎不存在仅取消引用两个参数之一的 PartialEq
的任何默认实现,因此应拒绝 a==&b
和 &a==b
。