错误"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
.
它也能工作的原因
我写这段代码是为了看看当我将两个字符串传递给一个函数然后 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
.