变量声明与初始化
在 Rust 里,使用 let
关键字来声明变量。声明时可以选择初始化变量,如果不初始化,就需要显式指定变量的类型,因为编译器需要知道如何为其分配内存。
基本声明与初始化
fn main() {
// 声明并初始化一个变量
let num = 42;
println!("The value of num is: {}", num);
// 声明变量并显式指定类型,暂不初始化
let x: i32;
x = 10;
println!("The value of x is: {}", x);
}
变量的可变性
Rust 中的变量默认是不可变的,这意味着一旦变量被赋值,就不能再更改它的值。若要修改变量的值,需要使用 mut
关键字将其声明为可变变量。
不可变变量
fn main() {
let num = 5;
// 以下代码会导致编译错误
// num = 6;
println!("The value of num is: {}", num);
}
可变变量
fn main() {
let mut num = 5;
num = 6;
println!("The value of num is: {}", num);
}
变量的作用域
变量的作用域决定了变量在代码中的可见性和生命周期。在 Rust 中,变量的作用域通常是从声明它的地方开始,到包含它的代码块结束。
fn main() {
{
let inner_num = 20;
println!("Inner num: {}", inner_num);
}
// 以下代码会导致编译错误,因为 inner_num 已超出作用域
// println!("Inner num: {}", inner_num);
}
变量类型
Rust 是静态类型语言,每个变量都有一个确定的类型。编译器在编译时会进行类型检查,确保代码中的操作与变量类型相匹配。变量类型可以通过类型推断或显式指定来确定。
类型推断
fn main() {
let num = 3.14;
// 编译器推断 num 的类型为 f64
}
显式类型指定
fn main() {
let num: u32 = 100;
}
变量所有权
所有权是 Rust 的核心特性之一,它用于管理内存和资源。每个值在 Rust 中都有一个变量作为其所有者,当所有者变量离开作用域时,值所占用的内存会被自动释放。
fn main() {
let s1 = String::from("hello");
let s2 = s1;
// 以下代码会导致编译错误,因为 s1 的所有权已转移给 s2
// println!("s1: {}", s1);
println!("s2: {}", s2);
}
引用和借用
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}