Rust基础[part2]_变量和可变类型
可变变量与不可变变量
可以不指定数据类型
可变变量------mutable
rust
fn immutable() {
let x = 5;
println!("The value of x is: {}", x);
}
不可变变量------immutable
rust
fn mutable() {
let mut y = 10;
println!("The value of y is: {}", y);
y = 15;
println!("The value of y is now: {}", y);
}
常量------constants
-
需要制定明确的数据类型,并且需要使用大写字母
-
需要使用常量表达式进行赋值
-
不支持重定义(遮蔽)
rust
const NUM: i32 = 5;
const THREE_HOURS: i32 = 60 * 60 * 3;
不可变量和常量的区别
- 常量在编译期就就确定了值,不能在运行时进行改变; 不可变量知道运行期才能确认下来。
- 常量不可修改,不可变变量可以通过shadowing来进行修改
- 常量必须声明类型,不可变变量不需要声明类型。
- 常量必须使用大写字母。
静态变量------static
需要通过mut
来指定可变, unsafe
块是必须的,因为静态变量在多线程环境中可能会引发数据竞争问题。
rust
static mut NUMBER: i32 = 10;
fn static_num() {
unsafe {
println!("static NUMBER: {}", NUMBER);
}// 这里可以访问静态变量NUMBER
}
作用域scope和遮蔽shadowing
rust
fn binding() {
// 绑定生存于main函数中
let long_lived_binding = 1;
// 代码块, 比main函数拥有更小的作用域
{
// 绑定生存于代码块中
// 这里的short_lived_binding只在这个代码块中有效
let short_lived_binding = 2;
println!("short_lived_binding: {}", short_lived_binding);
// 遮蔽,在作用域中可以遮蔽成功
let short_lived_binding = 3;
println!("short_lived_binding after shadowing: {}", short_lived_binding);
println!("long_lived_binding: {}", long_lived_binding);
// 遮蔽长期绑定的变量
// 这里的long_lived_binding会遮蔽外层的同名变量
let long_lived_binding = 4;
println!("long_lived_binding after shadowing: {}", long_lived_binding);
}
println!("long_lived_binding after block: {}", long_lived_binding);
// println!("short_lived_binding after block: {}", short_lived_binding); // 这里会报错,因为short_lived_binding在代码块外不可见
// 遮蔽长期绑定的变量
let long_lived_binding = 5_f32;
println!("long_lived_binding after shadowing: {}", long_lived_binding);
}