짧은 버전 : a + b
꽤 같은 a.add(&b)
로 하지 때문에T
가 Deref<T>
구현은, 물건을 불면 메서드 호출 및 운영자 호출이 왼쪽을 역 참조와 관련하여 작동하는 방식에 아무 의미 등의 차이를하지 않습니다 .
긴 버전 :
+
연산자와 Add.add
가 멀리 참조 복용에 관한 한 서로 다르게 작동합니다.
+
오퍼레이터은 두 피연산자를 모두 참조로 사용합니다. A
및 B
의 피연산자에 대한 a + b
은 A
에 대해 Add<B, C>
의 구현이 있어야하며 C
값을 생성합니다. 전술 한 바와 같이, a
및 b
은 참고로 취해진 다. 이 참조는 자동으로 작성됩니다. 추측은 없습니다.
let a = 1i;
let b = a + a; // this one works
let c = a + &a; // mismatched types: expected `int`, found `&int` (expected int, found &-ptr)
let d = &a + a; // binary operation `+` cannot be applied to type `&int`
let e = &a + &a; // binary operation `+` cannot be applied to type `&int`
없음 역 참조는이 모든 발생하지, 그래서 사기 T: Deref<T>
요구 사항은 아무것도 폭파하지 않습니다 여기 그들이 작동하는 방법입니다.
Add.add
모두를 참조로 취합니다. 정규 함수 호출로서, 필요할 때 왼손잡이를 자동으로 역 참조하고 참조 할 수 있습니다. 메서드 인수로 오른쪽이 그대로 전달되는 동안 왼쪽 측면은 가능한 한 많이 참조 해제되어 add
이 의미하는 가능한 모든 메서드를 찾습니다. 일반적으로 괜찮 으면 원하는대로 할 수 있지만이 경우 T
(유형이 a
인)은 Deref<T>
을 구현하기 때문에 그렇지 않습니다. 따라서 역 참조는 T
이됩니다. 그런 다음 T
을 구현하고 Deref<T>
을 구현하고 T
을 참조하십시오. 게다가 T
은 Deref<T>
을 구현하므로 T
으로 역 참조합니다. 재귀 한계에 도달 할 때까지이 작업을 계속합니다. 실제로 T
을 구현하면 Deref<T>
은 전혀 이해가되지 않습니다. 당신의 명확한 설명을위한
let a = 1i;
let b = a.add(a); // mismatched types: expected `&int`, found `int` (expected &-ptr, found int)
let c = a.add(&a); // this one works (a reference to the LHS is taken automatically)
let d = (&a).add(a); // mismatched types: expected `&int`, found `int` (expected &-ptr, found int)
let e = (&a).add(&a); // this one works (LHS is dereferenced and then rereferenced)
감사 :
는 비교를 위해, 여기에 메소드 호출이 작품을 추가하는 방법에 대한 몇 가지 데모입니다!나는 deref 특성을 추가했다. T가 (코드에서 다른 오류를 수정하기 위해) 역 참조 될 수 있다는 것을 의미한다고 생각했는데, 이것이 실제로 의미하는 바가 아니다. 그러나'a + b'와'a.add (& b)'의 차이에 대한 설명이 필요했습니다. – BigEpsilon