Ссылка перед назначением в Rust - PullRequest
0 голосов
/ 17 ноября 2018

Я играю с ссылками на Rust:

fn main() {
    let str = String::from("Hallo");
    let &x = &str;
}

Это приводит к следующей ошибке:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:3:9
  |
3 |     let &x = &str;
  |         ^-
  |         ||
  |         |hint: to prevent move, use `ref x` or `ref mut x`
  |         cannot move out of borrowed content

Что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Добавление к ответа 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, потому что оно не создается как ссылка) из ссылки.

0 голосов
/ 17 ноября 2018

Вам не нужно это & при let x

let str = String::from("Hallo");
let x = &str;

Или, если вы хотите объявить тип вручную

let string = String::from("Hallo");
let x: &str = &string;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...