在C ++中,我可以进行就地分配,在将变量var
打印到屏幕时递增变量{
int var = 5;
std::cout << ( var += 1 ) << std::endl;
我这样做是因为Rust没有输入/减少运算符++
&amp; --
。我在Rust尝试过:
let mut counter = 0;
println!("{}", (counter += 1));
这是在说:
error[E0277]: the trait bound `(): std::fmt::Display` is not satisfied
--> src/main.rs:3:20
|
3 | println!("{}", (counter += 1));
| ^^^^^^^^^^^^^^ the trait `std::fmt::Display` is not implemented for `()`
|
= note: `()` cannot be formatted with the default formatter; try using `:?` instead if you are using a format string
= note: required by `std::fmt::Display::fmt`
答案 0 :(得分:5)
Rust中的赋值运算符不会评估为赋值;他们评价为()
。因此,您需要在赋值后读取变量以获取新值。您可以使用块来执行此操作,因为块也是表达式。
let mut counter = 0;
println!("{}", { counter += 1; counter });
如果您经常这样做,请考虑定义一个宏:
macro_rules! inc {
($e:expr) => {
{ $e += 1; $e }
}
}
let mut counter = 0;
println!("{}", inc!(counter));
答案 1 :(得分:5)
最短的解决方案是返回值:
let mut counter = 0;
println!("{}", {counter += 1; counter});
但老实说,我会说这不是惯用的Rust,你也可以把它写在另一条线上:
let mut counter = 0;
counter += 1;
println!("{}", counter);
答案越长,您无法获得作业的价值。 AddAssign
的特征定义为
pub trait AddAssign<Rhs = Self> {
fn add_assign(&mut self, Rhs);
}
值得注意的是,该方法没有返回任何值。 Rust没有对赋值结果有用的值,因为通常没有。所有权语义使得弄清楚&#34;返回值&#34;像let x = String::new();
这样的东西应该是。如果是String
,那么x
所拥有的所有权会发生什么?
由于所有表达式都返回某些类型,因此赋值将返回空元组(()
),也称为单位类型。
在 this 的情况下,该值是一个整数,它实现Copy
特征。这意味着您可以从块中轻松返回副本。
相同的解决方案将“工作”#34;对于String
,直到您之后尝试使用它:
let mut string = String::new();
println!("{}", {string += "a"; string});
println!("{}", string); // use of moved value: `string`
可以通过返回引用来修复:
println!("{}", {string += "a"; &string});
但是在这一点上,并没有任何&#34;拯救&#34;要做。