在阅读Hands-On Concurrency with Rust时,我遇到了一个与old Rust book中所示示例相似的示例:
fn main() {
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x);
}
在两本书中,他们都解释说这不会编译。这两本书都说println!
宏是从x
隐式借用的。旧的Rust书说以下话:
我们的&mut T指向x,因此不允许创建任何 &Ts
“动手并发”添加了以下内容:
如果要编译此程序,我们将面临 y的更新和x的读取,取决于CPU和内存 订购。
这两种解释似乎都说得通,但是,如果我在最新版本的Rust稳定版(1.36和1.37)上编译并运行此代码,则这些代码可以编译并正常运行。
Rust中发生了哪些变化,使得它可以进行编译,同时又避免了可能导致较旧版本的Rust产生编译器错误的潜在问题?