一、变量与常量
Published on
变量
变量绑定
使用let语句将字面值或另一变量绑定至一个变量。Rust是静态类型语言,每个变量的类型在编译期就已经确定,变量类型可以手动指定也可由编译器推断。
// 将字面值绑定至变量
let an_integer = 1u32;
// 将另一变量绑定至此变量
let copied_integer = an_integer;
可变性
基本上所有的语言中,变量默认都是可变的。但是在Rust中,为了达到最大的安全性,变量默认为不可变的,如需使用可变变量,需要使用mut显示声明。
// 声明不可变变量
let immutable_binding = 1;
// 错误,不可修改不可变变量
immutable_binding += 1
// 声明可变变量
let mut mutable_binding = 1;
// 修改可变变量
mutable_binding += 1;
作用域
每个变量有其作用域,它被限制为只在其所在代码块中有效。
fn main() {
// 此变量在整个main函数内有效
let long_lived_binding = 1;
// 此代码块的作用域小于main函数
{
// 此变量只在当前代码块中有效
let short_lived_binding = 2;
// 正确
println!("inner short: {}", short_lived_binding);
}
// 代码块结束
// 错误,超出作用域,无法使用此变量
println!("outer short: {}", short_lived_binding);
// 正确
println!("outer long: {}", long_lived_binding);
}
重影
Rust中的变量可以重名,后定义的变量在其作用域中会隐藏先定义的同名变量(被隐藏的变量只是无法访问,但是仍然存在)。
fn main() {
// 定义了一个变量
let shadowed_binding = 1;
{
// 可以访问此变量
println!("before being shadowed: {}", shadowed_binding);
// 定义了同名变量,在当前块中,隐藏了前一个变量
let shadowed_binding = "abc";
println!("shadowed in inner block: {}", shadowed_binding);
}
// 超出作用域,取消重影
println!("outside inner block: {}", shadowed_binding);
// 定义了同名变量,隐藏了前一个变量
let shadowed_binding = 2;
println!("shadowed in outer block: {}", shadowed_binding);
}
常量
常量使用const进行声明,且必须指定类型。常量与不可变变量类似,但是有以下不同之处:
- 常量不能使用mut修饰
- 常量可以声明在任何作用域,包括全局作用域
- 常量必须被赋予一个常量表达式,其值必须在编译期间确定
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
静态变量
静态变量是具有静态生命周期(‘static)的变量,类似其它语言的全局变量。与普通变量类似,它默认是只读的,如果需要修改,要使用mut修饰。但是由于多线程安全问题,修改静态变量的代码是不安全(unsafe)的。
字面值
可以直接在代码中使用字面值。
1 // 整数
1.2 // 浮点数
'a' // 字符
"abc" // 字符串
true // 布尔
() // unit类型
0x1a // 16进制整数
0o12 // 8进制整数
0b11 // 2进制整数
100_000 // 数值中使用下划线增强可读性,值与无下划线相同
1.3e-4 // 科学计数法
100i128 // 指定数据类型