错误"left-hand of expression not valid"是什么意思?

What is the meaning of the error "left-hand of expression not valid"?

我写这段代码是为了看看当我将两个字符串传递给一个函数然后 return 它们再次返回时会发生什么:

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

此操作在传递单个字符串并 returning 返回时工作正常。

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

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

这是怎么回事?错误的含义是什么,在代码中会遇到什么情况?

您缺少 let 关键字;它应该是一个变量或一个 let 语句:

let (s3, s4) = take_n_giveback(s3, s4);
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)
}
let ... = ... // or let mut

是一个绑定:它创建新变量。

... = ...

(没有let)是一个赋值:它改变已经绑定的变量(或其部分)的值。有关此差异的更多解释,请参阅

绑定的左手必须是模式;赋值的左边必须是 place 表达式(以前称为左值)。如 https://doc.rust-lang.org/reference/expressions.html#place-expressions-and-value-expressions

中所述

A place expression is an expression that represents a memory location. These expressions are paths which refer to local variables, static variables, dereferences (*expr), array indexing expressions (expr[expr]), field references (expr.f) and parenthesized place expressions. All other expressions are value expressions.

(s3, s4) 是一个模式,但它不是一个位置表达式,因为它不是以上之一;它不代表固定的内存位置。

This operation works fine when passing single string and returning back.

变量名,如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.

它也能工作的原因