一、开个头——认识 Rust
每一门语言的入门几乎都从那句熟悉的“Hello World”开始。Rust 也不例外。
Rust 是一门强调 性能、安全性 和 并发 的系统编程语言。它不像 C/C++ 那样容易踩内存的坑,也不像 Java 那样依赖垃圾回收机制。Rust 在设计上兼顾了底层控制力和高级语言的安全性。
如果你第一次接触它,不用担心。我们就从最简单的打印语句开始,一步步了解这门语言的基本语法。
二、第一个程序:Hello World
Rust 源码文件的扩展名是 .rs,默认的程序入口是一个叫 main 的函数。
我们先写一段最经典的代码:
// main.rs
fn main() {
println!("Hello, world!");
}
保存后执行以下命令编译运行:
$ rustc main.rs
$ ./main
Hello, world!
是不是很眼熟?
Rust 的 println! 是一个宏(注意结尾的感叹号),它会在控制台输出文字并自动换行。
如果你熟悉 C、Java 这些语言,Rust 的语法看起来应该不陌生。
不过它和 C 不一样的地方在于:Rust 所有函数必须显式声明,并且强类型检查更严格。
扩展版
fn main() {
println!("Hello World!");
println!("I'm learning Rust!");
}
运行后输出:
Hello World!
I'm learning Rust!
Rust 的每一条语句结尾都要带分号 ;。
如果你漏掉分号,编译器不会糊弄你——它会很认真地指出错误。
三、写代码也得写点注释
程序不是给机器看的,更多时候是给人看的。Rust 的注释有三种写法:
| 注释类型 | 示例 | 用途 |
|---|---|---|
| 行注释 | // 这是行注释 | 最常用 |
| 块注释 | /* ... */ | 注释多行代码 |
| 文档注释 | /// 这是文档注释 | 用于生成文档 |
例子:
fn main() {
// 这是行注释
println!("Hello, Rust!");
/*
* 块注释可以跨多行
* 一般调试时用来临时屏蔽代码
*/
/// 文档注释(可以生成 HTML 文档)
//! 模块级别的文档注释
}
Rust 推荐用 //,简洁明了。
块注释一般只在调试或暂时屏蔽代码时使用。
四、输出一点有意思的内容
Rust 的输出系统非常强大。
println! 宏不仅能打印字符串,还能格式化各种变量。
fn main() {
let name = "Alice";
let age = 25;
println!("我的名字是 {},今年 {} 岁。", name, age);
println!("{1} 今年 {0} 岁。", age, name);
println!("{subject} {verb} {object}",
subject="那只狐狸", verb="跳过", object="那只懒狗");
println!("十进制:{}", 42);
println!("二进制:{:b}", 42);
println!("十六进制:{:x}", 42);
}
输出结果:
我的名字是 Alice,今年 25 岁。
Alice 今年 25 岁。
那只狐狸 跳过 那只懒狗
十进制:42
二进制:101010
十六进制:2a
Rust 的格式化字符串支持很多控制符:
| 格式符 | 含义 | 示例 |
|---|---|---|
{} | 默认格式化 | println!("{}", 10) |
{:b} | 二进制 | println!("{:b}", 10) |
{:x} | 十六进制 | println!("{:x}", 255) |
{:.2} | 保留两位小数 | println!("{:.2}", 3.1415) |
Rust 在编译时就会检查参数数量是否匹配,不用担心漏写变量。
五、调试输出和自定义打印
有时候我们需要查看结构体里的数据,直接打印是行不通的。Rust 不允许随意打印用户定义的类型。
想打印结构体,需要实现 Debug 或 Display。
#[derive(Debug)]
struct Person {
name: &'static str,
age: u8,
}
fn main() {
let p = Person { name: "Peter", age: 28 };
println!("{:?}", p);
println!("{:#?}", p); // 美化打印
}
输出:
Person { name: "Peter", age: 28 }
Person {
name: "Peter",
age: 28,
}
如果想更漂亮一点,用 Display:
use std::fmt;
struct Point { x: f64, y: f64 }
impl fmt::Display for Point {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "x={}, y={}", self.x, self.y)
}
}
fn main() {
let p = Point { x: 3.3, y: 7.2 };
println!("{}", p);
}
输出:
x=3.3, y=7.2
小提示:
#[derive(Debug)]会自动生成调试格式输出
Display需要自己写打印格式
{}调用的是Display,{:?}调用的是Debug
六、认识一下 Rust 的数据类型
Rust 的类型系统很严格。常见的基础类型分为两类:
| 分类 | 类型名 | 示例 | 说明 |
|---|---|---|---|
| 整数(有符号) | i8, i16, i32, i64, i128, isize | let x: i32 = -5; | 能表示负数 |
| 整数(无符号) | u8, u16, u32, u64, u128, usize | let y: u32 = 42; | 只能是正数 |
| 浮点数 | f32, f64 | let z = 3.14; | 默认是 f64 |
| 字符 | char | 'A', '你' | 4 字节 Unicode |
| 布尔 | bool | true, false | 逻辑判断 |
| 单元类型 | () | 无值返回 | 一般用于函数无返回值时 |
例子:
fn main() {
let a: bool = true;
let b: i32 = -12;
let c: u32 = 42;
let d: f64 = 3.14159;
let e: char = 'R';
println!("布尔:{}", a);
println!("有符号整数:{}", b);
println!("无符号整数:{}", c);
println!("浮点数:{}", d);
println!("字符:{}", e);
}
输出:
布尔:true
有符号整数:-12
无符号整数:42
浮点数:3.14159
字符:R
Rust 会自动推断类型,比如:
let x = 5; // 默认是 i32
let y = 3.0; // 默认是 f64
七、综合练习:输出一个用户信息表
use std::fmt;
#[derive(Debug)]
struct User {
name: String,
age: u8,
score: f32,
}
impl fmt::Display for User {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "姓名:{} | 年龄:{} | 分数:{:.1}", self.name, self.age, self.score)
}
}
fn main() {
let user = User {
name: "Alice".to_string(),
age: 23,
score: 92.5,
};
println!("用户信息(Display):{}", user);
println!("用户信息(Debug):{:?}", user);
}
输出结果:
用户信息(Display):姓名:Alice | 年龄:23 | 分数:92.5
用户信息(Debug):User { name: "Alice", age: 23, score: 92.5 }
八、阶段小结
| 阶段 | 内容 | 要点 |
|---|---|---|
| 第一阶段 | Hello World | 学会运行 Rust 程序 |
| 第二阶段 | 注释与结构 | 熟悉注释风格 |
| 第三阶段 | 格式化输出 | 掌握 println! |
| 第四阶段 | Debug / Display | 区别调试输出与友好输出 |
| 第五阶段 | 基础类型 | 理解 Rust 的数据系统 |
| 第六阶段 | 综合案例 | 学会组合使用结构体与输出 |
九、收个尾
到这里,我们算是正式踏入了 Rust 的大门。
1430

被折叠的 条评论
为什么被折叠?



