如何在Rust中进行就地分配?

时间:2017-03-28 00:43:49

标签: rust

在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`

2 个答案:

答案 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;要做。