错误“表达式左手无效”是什么意思?

Aks*_*aik 0 ownership rust

我编写了这段代码,以查看将两个字符串传递给函数并将它们再次返回时会发生什么情况:

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)
}
Run Code Online (Sandbox Code Playgroud)

我收到一个没有帮助的错误:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

fn take_n_giveback(x: String) -> (String) {
    x
}
Run Code Online (Sandbox Code Playgroud)

怎么了 错误的含义是什么,在什么情况下代码会遇到错误?

Ale*_*nov 9

let ... = ... // or let mut
Run Code Online (Sandbox Code Playgroud)

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

... = ...
Run Code Online (Sandbox Code Playgroud)

(不带let)是一种分配:它更改已绑定变量(或其部分)的值。请参阅Rust中的赋值语义是什么?有关此差异的更多说明。

绑定的左手必须是一个模式 ; 作业的左手必须是一个位置表达式(以前称为lvalue)。如https://doc.rust-lang.org/reference/expressions.html#place-expressions-and-value-expressions中所述

位置表达式是代表存储位置的表达式。这些表达式是引用局部变量,静态变量,解引用(*expr),数组索引表达式(expr[expr]),字段引用(expr.f)和带括号的位置表达式的路径。所有其他表达式都是值表达式。

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

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

变量名称(例如s3)既可以用作模式,也可以用作位置表达式。但是有着不同的含义!在作业中使用时

let mut s3 = String::from("hello");
s3 = take_n_giveback(s3);
Run Code Online (Sandbox Code Playgroud)

它代表声明的变量的位置let mut s3,因此只有一个变量;但在

let mut s3 = String::from("hello");
let s3 = take_n_giveback(s3);
Run Code Online (Sandbox Code Playgroud)

它会创建一个名为的新变量s3,因此有两个不同的变量恰好具有相同的名称。这就是为什么即使第一个都不起作用的原因mut