比较平等与&和变化之间有什么区别? *关于论点?

时间:2017-12-24 04:45:42

标签: pointers rust

我写了以下函数:

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中的行为完全不同。我需要了解这些运算符的细微差别才能理解上述内容?

1 个答案:

答案 0 :(得分:1)

相关差异在于等于运算符的行为。 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的值的实现和&Bimpl 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相同。