Ответ 1
что ссылки не реализуют
Deref
Вы можете увидеть все типы, которые реализуют Deref
, и &T
находится в этом списке:
impl<'a, T> Deref for &'a T where T: ?Sized
Deref
вещь заключается в том, что синтаксический сахар применяется при использовании оператора *
с чем-то, что реализует Deref
. Посмотрите на этот небольшой пример:
use std::ops::Deref;
fn main() {
let s: String = "hello".into();
let _: () = Deref::deref(&s);
let _: () = *s;
}
error[E0308]: mismatched types
--> src/main.rs:5:17
|
5 | let _: () = Deref::deref(&s);
| ^^^^^^^^^^^^^^^^ expected (), found &str
|
= note: expected type '()'
found type '&str'
error[E0308]: mismatched types
--> src/main.rs:6:17
|
6 | let _: () = *s;
| ^^ expected (), found str
|
= note: expected type '()'
found type 'str'
Явный вызов deref
возвращает &str
, но оператор *
возвращает str
. Это больше похоже на то, что вы вызываете *Deref::deref(&s)
, игнорируя подразумеваемую бесконечную рекурсию.
Если бы
deref
вернула значение, оно было бы бесполезным, потому что оно всегда перемещалось, или имело бы семантику, резко отличающуюся от любой другой функции.
Хотя "бесполезно" немного сильно; это все еще будет полезно для типов, которые реализуют Copy
.
Смотрите также:
Обратите внимание, что все вышесказанное действительно верно и для Index
и для IndexMut
.