阅读本文,你将学会:使用cargo创建和运行rust项目,能够声明变量、常量、函数。
环境安装
环境安装直接参考官网:rust-lang.org/zh-CN/tools…
安装完成后执行rustc --version和cargo --version,如果没问题会有如下类似输出
rustc 1.92.0 (ded5c06cf 2025-12-08)
cargo 1.92.0 (344c4567c 2025-10-21)
vsocde 插件安装
vscode安装插件
项目创建
执行命令cargo new test-rust可创建项目,类似前端脚手架。
运行
cargo run,如果控制台输出Hello, world,那便恭喜你,正式进入rust世界了。
rust中的声明
不同于其他教程先介绍类型,本文先介绍最简单的声明语法。
1. 变量声明
基本变量声明
let x = 5; // 不可变变量(默认)
let mut y = 10; // 可变变量
let z: i32 = 15; // 显式指定类型
变量重声明
rust中变量可以重声明,并且有个专业名词——遮蔽(Shadowing)
let x = 5;
let x = x + 1; // 可以重新声明同名变量
let x = x * 2; // 类型可以改变
可变变量与不可变变量
上面的demo中有个关键字mut,它的作用是标记变量为可变变量。
rust中变量默认都是不可改的,这一点与js不一样。要声明一个可变变量,必须要加mut关键字。
let x = 5; // 不可变变量(默认)
x = x + 1; // 错误:不能修改不可变变量
let mut y = 10; // 可变变量
y = y + 10; // 正确:可以修改可变变量
不可变变量可以重新声明,重新声明时可以改变类型。
let x = 5; // 不可变变量(默认)
let x = 'x';
2. 常量声明
const MAX_POINTS: u32 = 100_000; // 编译时常量
static GLOBAL_VALUE: i32 = 42; // 静态变量
static mut COUNTER: u32 = 0; // 可变静态变量(不安全)
static常量可以是可变的,但如果声明为可变,使用的时候必须要包裹unsafe,如
println!(
"Hello, world!COUNTER={}",
unsafe { COUNTER }
);
}
let,const,static区别
既然let默认也是不可改的,那么这三者声明有何区别呢?只要记住以下四点就足够了。
- 大小写: 最直观的一点,作为常量声明,const和static必须大写,而let必须小写。(rust使用蛇形命名规范,不允许使用驼峰)
- 类型指定:const和static必须声明其类型。
- 作用域:let只能在块作用域内,但const和static可以是全局作用域
- 是否允许重新声明:const和static不允许重新声明,但let可以
- 初始化:let允许只声明不初始化,但const和static声明时必须初始化,并且const常量必须在编译时可求值(不允许使用
const B:i32 = x * 2或const B:i32 = get_v()这种形式,但可以const B: i32 = 4 / 2;)
let,const,static区别一栏表
| 特性 | let | const | static |
|---|---|---|---|
| 作用域 | 块作用域 | 可以在任意作用域 | 全局作用域 |
| 生命周期 | 作用域内 | 编译时常量,无运行时生命周期 | 整个程序运行期间 |
| 内存分配 | 栈上 | 编译时替换(通常不分配内存) | 静态内存区 |
| 可变性 | 默认不可变,可用 mut | 永远不可变 | 默认不可变,可用 mut(需要 unsafe) |
| 线程安全 | 局部,线程安全 | 线程安全 | 不可变:线程安全;可变:需要同步 |
| 类型注解 | 可省略(类型推断) | 必须显式注明 | 必须显式注明 |
| 初始化时机 | 运行时 | 编译时 | 编译时(在程序启动前初始化) |
3. 函数声明
类似ts的function,可以指定返回值类型
fn greet(name: &str) {
println!("Hello, {}!", name);
}
fn add(x: i32, y: i32) -> i32 {
x + y // 没有分号,作为返回值
}
4. 结构体声明
类似ts的class和interface
struct User {
username: String,
email: String,
active: bool,
}
// 实例化
let user = User {
email: String::from("test@example.com"),
username: String::from("john"),
active: true,
};
impl
为结构体提供实现
impl User {
// 关联函数(类似静态方法)
fn new(username: String, email: String) -> User {
User {
username,
email,
active: true,
}
}
// 方法
fn get_username(&self) -> &str {
&self.username
}
}
5. 泛型
类似ts中的泛型,
struct Point<T> {
x: T,
y: T,
}
6. 枚举声明
类似ts的枚举,但并不是k-v形式
enum IpAddrKind {
V4,
V6,
}
7. 类型别名
这一点和ts的type声明很像
type Kilometers = i32;
type Result<T> = std::result::Result<T, std::io::Error>;
8. 其他声明
rust中还有其他特殊的声明,比如trait、mod、生命周期声明等语法,后续将详细介绍。