变量
变量默认是不可改变的(immutable)。
如果你尝试给一个已经定义好的变量重新赋值,那么就会报错。
fn main() {
let x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
error[E0384]: cannot assign twice to immutable variable `x`
可变性变量
变量只是默认不可变;可以在变量名之前加 mut 来使其可变。
但是可变性变量重新赋值不能改变其本身的类型。
fn main() {
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
The value of x is: 5
The value of x is: 6
使用大型数据结构时,适当地使用可变变量,可能比复制和返回新分配的实例更快。对于较小的数据结构,总是创建新实例,采用更偏向函数式的编程风格,可能会使代码更易理解,为可读性而牺牲性能或许是值得的。
常量
类似于不可变变量,常量(constants) 是绑定到一个名称的不允许改变的值,不过常量与变量还是有一些区别。
首先,不允许对常量使用 mut。常量不光默认不能变,它总是不能变。
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
[隐藏(Shadowing)
fn main() {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("The value of x in the inner scope1 is: {}", x);
}
{
let x = "abc";
println!("The value of x in the inner scope2 is: {}", x);
}
println!("The value of x is: {}", x);
}
The value of x in the inner scope1 is: 12
The value of x in the inner scope1 is: abc
The value of x is: 6
这段代码在JavaScript里面是错误的,但是在rust里面是正确的。
我们可以定义一个与之前变量同名的新变量。Rustacean 们称之为第一个变量被第二个隐藏 了,这意味着程序使用这个变量时会看到第二个值。可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏。
而且隐藏的时候,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。这在可变性变量里面是不允许的,因为可变性变量是赋值,而隐藏是重新创建了一个同名的新变量。
网友评论