Что означает ошибка «левая часть выражения недействительна»? - PullRequest
0 голосов
/ 17 марта 2019

Я написал этот код, чтобы увидеть, что происходит, когда я передаю две строки функции и возвращаю их снова:

fn main() {
    let mut s3 = String::from("hello");
    let mut s4 = String::from("wolrd");

    (s3, s4) = take_n_giveback(s3, s4);

    println!("{0} and {1}", s3, s4);
}

fn take_n_giveback(x: String, y: String) -> (String, String) {
    (x, y)
}

Я получаю ошибку, которая не помогает:

error[E0070]: invalid left-hand side expression
 --> src/main.rs:5:5
  |
5 |     (s3, s4) = take_n_giveback(s3, s4);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid

Эта операция отлично работает при передаче одной строки и возврате назад.

fn main() {
    let mut s3 = String::from("hello");
    s3 = take_n_giveback(s3);
    println!("{0} ", s3);
}

fn take_n_giveback(x: String) -> (String) {
    x
}

Что здесь не так?Что означает ошибка и в каких ситуациях можно встретить код?

Ответы [ 3 ]

9 голосов
/ 17 марта 2019
let ... = ... // or let mut

является привязкой : она создает новые переменные.

... = ...

(без let) является присваиванием : оно изменяет значения уже связанных переменных (или их частей). См. Какова семантика присваивания в Rust? для более подробного объяснения этой разницы.

Левая рука привязки должна иметь форму ; левой рукой присваивания должно быть место выражения (ранее называлось lvalue). Как объяснено в https://doc.rust -lang.org / reference / expressions.html # place-выражений-и-значений-выражений

Выражение места - это выражение, представляющее ячейку памяти. Эти выражения являются путями, которые ссылаются на локальные переменные, статические переменные, разыменования (*expr), выражения индексации массива (expr[expr]), ссылки на поля (expr.f) и выражения в скобках в скобках. Все остальные выражения являются выражениями значения.

(s3, s4) - это шаблон, но он не является выражением места, потому что он не является одним из вышеперечисленных; он не представляет фиксированное место в памяти.

Эта операция отлично работает при передаче одной строки и возврате обратно.

Имя переменной, например s3, можно использовать как шаблон, так и в качестве выражения места. Но с разными значениями! Когда он используется в назначении

let mut s3 = String::from("hello");
s3 = take_n_giveback(s3);

представляет местоположение переменной, объявленной let mut s3, поэтому существует только одна переменная; но в

let mut s3 = String::from("hello");
let s3 = take_n_giveback(s3);

создает новую переменную с именем s3, поэтому есть две разные переменные с одинаковым именем. Вот почему он работает, даже если первый не mut.

1 голос
/ 17 марта 2019

Вам не хватает ключевого слова let; это должна быть переменная или оператор let:

let (s3, s4) = take_n_giveback(s3, s4);
0 голосов
/ 17 марта 2019
fn main() {
    let s3 = String::from("hello");
    let s4 = String::from("wolrd");

    let (s3, s4) = take_n_giveback(s3, s4);

    println!("{0} and {1}", s3, s4);
}

fn take_n_giveback(x: String, y: String) -> (String, String) {
    (x, y)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...