Почему этот эталонный шаблон не разыменовывается, а затем не заимствует перед сопоставлением?

В 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)

Примечание: &(*(&mss)) ничего не делает, оно всегда будет таким же, как &mss. Если вы хотите, чтобы было явное разыменование, вам нужно сделать это следующим образом: &*mss (см., что & нет непосредственно на mss).

kmdreko 15.05.2024 18:56
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю, что означает «Ссылка» под «и, таким образом, заимствовать их», ссылочные шаблоны ничего не заимствуют, они только разыменовывают.

Однако они не вызывают Deref, поэтому ваш код не работает. Deref в шаблонах — это предмет незавершенной работы deref-паттернов, которые не полностью реализованы, но еще и стабилизированы.

Я думаю, что ссылка означает, что любые ссылки, сгенерированные во внутреннем шаблоне (с ключевым словом ref), заимствуют исходное значение.

cafce25 16.05.2024 10:52

Другие вопросы по теме