2017-12-24 18 views
0

나는 다음과 같은 기능을 쓴이 작품인수가 같음과 &와 *의 변형을 비교하는 것의 차이점은 무엇입니까?

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

관련된 차이점은 항등 연산자의 동작입니다. x == y&x == &y의 의미는 동일합니다. 즉, xy을 비교합니다.

&x == &y desugars to PartialEq::eq(&&x, &&y). 차례로 PartialEq 그것은 유형 AB의 값이 평등 (where A: PartialEq<B>)에 대한 비교 될 수 있다면, 우리는 유형 &A&B을 값의 비교를 위해 구현을 제공 "읽는 담요 구현

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

(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) 또는 x == y 같은 인 PartialEq::eq(*&&x, *&&y) 부른다.