我编写了这段代码,以查看将两个字符串传递给函数并将它们再次返回时会发生什么情况:
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
}
这是怎么了?错误的含义是什么?在什么情况下代码会遇到这种错误?
答案 0 :(得分:9)
let ... = ... // or let mut
是绑定:它创建新变量。
... = ...
(无let
)是赋值:它更改已绑定变量(或其部分)的值。有关此差异的更多说明,请参见What's the semantic of assignment in 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);
它表示let mut s3
声明的变量的位置,因此只有一个变量;但在
let mut s3 = String::from("hello");
let s3 = take_n_giveback(s3);
它将创建一个名为s3
的新变量,因此有两个不同的变量恰好具有相同的名称。这就是为什么即使第一个不是mut
也不行的原因。
答案 1 :(得分:1)
您缺少let
关键字;它应该是变量或let语句:
let (s3, s4) = take_n_giveback(s3, s4);
答案 2 :(得分:-1)
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)
}