我写了以下函数:

fn test() {
    let xs = [b"AAA", b"BBB"];
    let buf = b"AAA";
    println!("{:?}", xs.iter().find(|&x| &x == &&buf));
}

这可行,但是我很困惑,因为它们也可行:
  • println!("{:?}", xs.iter().find(|&x| x == &buf));
  • println!("{:?}", xs.iter().find(|&x| *x == buf));

  • 这些变化之间有什么区别? *&的行为似乎肯定与C语言完全不同。为了理解上述内容,我需要了解这些运算符的哪些细微差别?

    最佳答案

    相关的区别在于相等运算符的行为。 x == y&x == &y的语义相同:它们比较xy
    &x == &y PartialEq::eq(&&x, &&y) 无效。 PartialEq则具有全面的实现

    impl<'a, 'b, A, B> PartialEq<&'b B> for &'a A
    where
        A: PartialEq<B> + ?Sized,
        B: ?Sized,
    

    它显示为“如果可以比较AB类型的值是否相等(where A: PartialEq<B>),那么我们提供了一种比较&A&B(impl PartialEq<&B> for &A)类型的值的实现。”为了简洁起见,我省略了一生。

    实现是straightforward,它比较取消引用的值。
    fn eq(&self, other: & &'b B) -> bool {
        PartialEq::eq(*self, *other)
    }
    

    因此PartialEq::eq(&&x, &&y)称为PartialEq::eq(*&&x, *&&y),它与PartialEq::eq(&x, &y)x == y相同。

    关于pointers - 比较带有参数&和*的变体的相等性之间的区别是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47958132/

    10-11 08:24