Добавление к ответа wiomoc : в зависимости от того, какой язык (языки) вы уже знали, объявление переменных в Rust может немного отличаться. В то время как в C / C ++ вы явно должны объявить, что вам нужна переменная указатель / ссылка:
int *p = &other_int;
В Rust достаточно просто использовать let
, поэтому приведенное выше значение в Rust будет
let p = &other_int;
а когда пишешь
let &s = &string;
Это соответствует шаблону, поэтому компилятор Rust читает его примерно как «Я знаю, что у меня есть ссылка, и я хочу связать все, на что он ссылается, с именем p
». Если вы не знакомы с сопоставлением с шаблоном, более очевидным примером (который также работает в Rust) будет
let point = (23, 42);
let (x, y) = point;
Вторая строка распаковывает правую часть, чтобы соответствовать левой части (оба являются кортежами двух значений), и связывает имена переменных слева со значениями в той же позиции в структуре справа. В приведенном выше случае менее очевидно, что оно соответствует вашему «структурному описанию».
Результат let &x = &str;
, т. Е. «Я знаю, &str
- это ссылка, пожалуйста, свяжите все, что относится к переменной x
», это означает, что вы пытаетесь, чтобы x
был таким же, как str
, когда в этой строке все, что у вас есть, это заимствованная ссылка на str
. Вот почему компилятор говорит вам, что вы не можете создать собственное значение (которое будет x
, потому что оно не создается как ссылка) из ссылки.