我写这段代码是为了看看当我将两个字符串传递给一个函数并再次将它们返回时会发生什么:
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
}
这是怎么回事?错误的含义是什么,在代码中会遇到什么情况?
最佳答案
let ... = ... // or let mut
是一个绑定(bind):它创建新变量。
... = ...
(没有 let
)是一个赋值:它改变已经绑定(bind)的变量(或其部分)的值。参见 What's the semantic of assignment in Rust?有关此差异的更多解释。
绑定(bind)的左手必须是模式;赋值的左边必须是一个place expression(以前称为左值)。如 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
也能正常工作。
关于rust - 错误 "left-hand of expression not valid"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55204816/