Variables 在铁锈中,什么';这两者之间的区别是什么;阴影“;及;易变性;?
在《变量与可变性》中,我们对这个主题进行了几次迭代,以演示Rust中变量的默认、不变行为:Variables 在铁锈中,什么';这两者之间的区别是什么;阴影“;及;易变性;?,variables,rust,immutability,mutability,Variables,Rust,Immutability,Mutability,在《变量与可变性》中,我们对这个主题进行了几次迭代,以演示Rust中变量的默认、不变行为: fn main() { let x = 5; println!("The value of x is {}", x); x = 6; println!("The value of x is {}", x); } 哪些产出: error[E0384]:无法将两次赋值给不可变变量`x` -->src/main.rs:4:5 | 2 |设x=5; | - |
fn main() {
let x = 5;
println!("The value of x is {}", x);
x = 6;
println!("The value of x is {}", x);
}
哪些产出:
error[E0384]:无法将两次赋值给不可变变量`x`
-->src/main.rs:4:5
|
2 |设x=5;
| -
| |
|对`x的第一次赋值`
|帮助:使此绑定可变:`mut x`
3 | println!(“x的值为{}”,x);
4 | x=6;
|^^^无法将两次赋值给不可变变量
但是,由于Rust对阴影变量的作用,我们可以简单地这样做来更改“不可变”x的值:
fn main() {
let x = 5;
println!("The value of x is {}", x);
let x = 6;
println!("The value of x is {}", x);
}
哪些输出(跳过详细信息):
x的值是5
x的值是6
有趣的是,此代码还生成上述两行作为输出,尽管我们不调用let
,而是第一次x
绑定到5
:
fn main() {
let mut x = 5;
println!("The value of x is {}", x);
x = 6;
println!("The value of x is {}", x);
}
变量如何(并非真正)避免重新分配的模糊性似乎与保护绑定到不可变(默认情况下)变量的值的既定目标背道而驰。来自同一章(也包含阴影部分):
当我们试图修改时,得到编译时错误是很重要的
更改以前指定为不可变的值,因为
这种情况可能会导致错误。如果我们的代码有一部分在
一个价值永远不会改变的假设和我们的另一部分
代码更改了该值,可能代码的第一部分
不会做它被设计用来做的事。这种错误的原因可能是
事后难以追查,尤其是第二次
这段代码只是偶尔更改值
在Rust中,编译器保证当您声明
不会改变,它真的不会改变。这意味着当你
阅读和编写代码,您不必跟踪如何和
值可能会更改的位置。因此,您的代码更容易推理
通过
如果我可以通过对
let
的天真调用,使我的不可变x
的这一重要功能被忽略,为什么我需要mut
?有没有什么方法可以让x
不可变,这样就没有让x
可以重新分配它的值呢?我认为混淆是因为你把名称和存储混为一谈了
fn main() {
let x = 5; // x_0
println!("The value of x is {}", x);
let x = 6; // x_1
println!("The value of x is {}", x);
}
在此示例中,有一个名称(x
)和两个存储位置(x_0
和x_1
)。第二个let
只是重新绑定名称x
,以引用存储位置x\u 1
。x_0
存储位置完全不受影响
fn main() {
let mut x = 5; // x_0
println!("The value of x is {}", x);
x = 6;
println!("The value of x is {}", x);
}
在本例中,有一个名称(x
)和一个存储位置(x_0
)。x=6
分配直接改变存储位置的位x_0
你可能会争辩说,它们做同样的事情。如果是这样,你就错了:
fn main() {
let x = 5; // x_0
let y = &x; // y_0
println!("The value of y is {}", y);
let x = 6; // x_1
println!("The value of y is {}", y);
}
这将产生:
y的值是5
y的值是5
这是因为更改x
引用的存储位置绝对不会影响存储位置x\u 0
,而y\u 0
包含指向该位置的指针。但是,
fn main() {
let mut x = 5; // x_0
let y = &x; // y_0
println!("The value of y is {}", y);
x = 6;
println!("The value of y is {}", y);
}
这无法编译,因为在借用时无法对x_0
进行变异
正如通过参考文献观察到的那样,Rust关心的是防止不必要的突变效应。这与允许阴影并不冲突,因为阴影时并没有更改值,只是以其他地方无法观察到的方式更改了特定名称的含义。阴影是一种严格的局部变化
因此,是的,您完全可以避免更改
x
的值。您不能做的是阻止名称x
所指的内容被更改。最多,你可以用一些东西来否认阴影。这是一个很好的答案,尤其是关于由于被借用而失败的部分。我等几天再接受。有没有办法打印链接到同一变量的所有值(即在本例中,如果我想看到x的所有x_I,在本例中是x_0和x_1)?@D8anija没有。没有人对表达式“不可变变量”感到震惊?它们不是反义词吗?