繁体   English   中英

为什么我不能打印通过 &mut 引用修改的变量?

[英]Why can't I print a variable I modify via a &mut reference?

Rust 是我在 Python 之后的第一语言,所以我试图通过玩和阅读它来理解所有参考/指针的东西。

我不明白以下情况之间的区别。

简单 - 这里没有问题
let mut val_a = 5;
println!("val_a is {}", val_a);
val_a = 10;
println!("Now val_a is {}", val_a);
不简单——借贷问题
let mut val_b = 5;
let val_b_ref = &mut val_b;
println!("val_b by ref is {}", val_b_ref);
// Can not call line below because of further mutation of val_b
// println!("val_b is {}", val_b);
*val_b_ref = 20;
println!("val_b by ref is {}", val_b_ref);
// Now val_b can be called since no mutation after that
println!("val_b is {}", val_b); 

我不明白为什么在第一种情况下我可以打印val_a尽管它在之后发生了变异,而当它通过 deref 运算符发生变异时我不能打印val_b

Rust 不允许可变值的别名。 这意味着最多只能有一个名称,通过该名称可以在任何给定时刻改变值。 现存的可变引用创建了一个新名称,通过该名称可以改变值,因此只要它还活着,它就会“阻止”对原始名称的访问。

在第一个示例中,只有一个名称( val_a )。 您可以通过此名称读取和写入基础值。

在第二个示例中,您有两个名称: val_bval_b_ref 注释掉的行会导致编译错误,因为您无法通过该名称访问val_b ,因为存在另一个名称,通过该名称可以改变值 ( val_b_ref )。 在您可以再次使用val_b之前,这个其他名称的生命周期必须结束。

因为 Rust 实现了变量的非词法生命周期, val_b_ref在最后一次使用后在所有行上都被认为是死的,这就是为什么您可以在第二个示例的最后一行再次使用val_b的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM