该防锈参考说:
赋值或复合赋值表达式的左操作数是左值上下文,一元借用的单个操作数也是如此.
[...]
在左值上下文中使用右值时,会创建并使用临时的未命名左值.
这种左值促销显然适用于借款:
let ref_to_i32 = &27; // a temporary i32 variable with value 27 is created
Run Code Online (Sandbox Code Playgroud)
但它似乎不适用于任务(虽然引用说的是所有左值上下文,而不仅仅是借用):
27 = 28; // error[E0070]: invalid left-hand side expression
Run Code Online (Sandbox Code Playgroud)
E0070的错误描述未提及此右值促销.这是参考文献中的错误还是确实有某种方法可以通过赋值或复合赋值表达式触发rvalue促销?
还有第三种左值上下文,参考描述也不正确.只要存在带有a的模式,ref绑定到该模式的左值就是左值上下文.事实证明,促销适用于这种情况:
let ref x = 3; // works
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");
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 …Run Code Online (Sandbox Code Playgroud)