程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么 Rust 不让我比较 Foo 和 &Foo?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么 Rust 不让我比较 Foo 和 &Foo??

开发过程中遇到为什么 Rust 不让我比较 Foo 和 &Foo?的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么 Rust 不让我比较 Foo 和 &Foo?的解决方法建议,希望对你解决为什么 Rust 不让我比较 Foo 和 &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 应该被拒绝。

大佬总结

以上是大佬教程为你收集整理的为什么 Rust 不让我比较 Foo 和 &Foo?全部内容,希望文章能够帮你解决为什么 Rust 不让我比较 Foo 和 &Foo?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。