我写了以下函数:
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中的行为完全不同。我需要了解这些运算符的细微差别才能理解上述内容?
答案 0 :(得分:1)
相关差异在于等于运算符的行为。 x == y
和&x == &y
的语义相同:它们比较x
和y
。
&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,
它显示“如果可以比较类型A
和B
的值是否相等(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
相同。