В The Rust Reference есть введение эталонных шаблонов и там написано
Ссылочные шаблоны разыменовывают указатели, которые сопоставляются. и, таким образом, одолжить их
Поэтому я пытаюсь написать несколько кодов, чтобы почувствовать:
struct Myss<'a> {
inner: &'a str,
}
impl<'a> Myss<'a> {
fn new(s: &'a str) -> Self {
Myss { inner: s }
}
}
impl<'a> Deref for Myss<'a> {
type Target = &'a str;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
fn main() {
let s = "abcde";
let mss = Myss::new("abcde");
match &mss { // why not same as & (*(&mss)) -> &(* mss.deref()) -> & (&str) -> &&str
&"abcde" => { // => Errors here: expected `Myss<'_>`, found `&str`
println!("matched");
}
_ => {
println!("others");
}
}
}
Переменная ms владеет типом &Myss, который является ссылкой на тип, в котором реализован признак Deref, а шаблон &"abcde" imo является ссылочным шаблоном. Я ожидаю, что значение будет следовать по пути, например
`& (*(&mss)) -> &(* mss.deref()) -> & (* &Target) -> & Target -> & (&str) поскольку в ссылке сказано, что указатели сначала будут разыменованы, а затем заимствованы (или я что-то упускаю?)
который можно сопоставить с шаблоном &"abcde" с типом & (&str).
Но компилятор жалуется, что
Mismatched types
expected `Myss<'_>`, found `&str`
Почему ссылка сначала не разыменовывается, а затем не заимствуется по мере появления ссылки?
(Версия компилятора: ржавчина 1.77.2)

Я не знаю, что означает «Ссылка» под «и, таким образом, заимствовать их», ссылочные шаблоны ничего не заимствуют, они только разыменовывают.
Однако они не вызывают Deref, поэтому ваш код не работает. Deref в шаблонах — это предмет незавершенной работы deref-паттернов, которые не полностью реализованы, но еще и стабилизированы.
Я думаю, что ссылка означает, что любые ссылки, сгенерированные во внутреннем шаблоне (с ключевым словом ref), заимствуют исходное значение.
Примечание:
&(*(&mss))ничего не делает, оно всегда будет таким же, как&mss. Если вы хотите, чтобы было явное разыменование, вам нужно сделать это следующим образом:&*mss(см., что&нет непосредственно наmss).