我写了以下函数:
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
的语义相同:它们比较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
相同。关于pointers - 比较带有参数&和*的变体的相等性之间的区别是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47958132/