上一章
CH.023 小时实战: 成绩计算器 CLI

变量、类型与函数

Rust 类型系统深度解析

类型系统:比 TypeScript 更深一层

TypeScript 的类型在编译后消失,运行时还是 JavaScript,类型只是辅助工具。Rust 的类型是语言核心——影响内存布局、函数调用约定、性能特征,类型错误往往是内存安全问题的早期警告。


整数类型

Rust 的整数类型按位数分为 8/16/32/64/128 位,每种分有符号(i)和无符号(u):

对比:数字类型
JS
TypeScript
// TypeScript:所有数字都是 f64
let count: number = 42;
let price: number = 9.99;
let big: bigint = 9007199254740993n;
Rs
Rust
// Rust:选择合适的类型
let count: i32 = 42;        // 32 位有符号整数
let price: f64 = 9.99;      // 64 位浮点数
let age: u8 = 25;           // 0-255
let big: i64 = 9_007_199_254_740_993; // 下划线分隔

Rust 要求你明确选择类型。这不是繁琐,是在告诉编译器内存布局,让它做更好的优化和更严格的检查。

isizeusize 大小等于机器字长(64 位系统上是 64 位),专门用于数组索引。


字符串:两种形式

这是前端工程师最容易困惑的地方。

对比:字符串
JS
JavaScript
// JS:字符串只有一种
const hello = "hello";        // 可变可传递
const world = hello + " world";
console.log(world.length);
Rs
Rust
// Rust:字符串有两种形式
let hello: &str = "hello";    // 字符串切片:不可变引用,在只读段
let world: String = String::from("hello world"); // 堆分配,可修改

// &str 转 String
let owned = hello.to_string();

// String 转 &str(自动解引用)
let slice: &str = &world;

&str 是视图(借用),String 是所有者(堆上)。函数参数尽量用 &str,更灵活;需要存储或修改时用 String。


变量遮蔽(Shadowing)

Rust 独特的特性:用同名 let 重新绑定变量,可以改变类型:

let x = 5;
let x = x + 1;          // 遮蔽,x 是 6
let x = x.to_string();  // 遮蔽,x 是 String 类型
println!("{}", x);       // "6"

这和 JavaScript 的 let 重新赋值不同——Rust 的遮蔽创建了新变量,可以改变类型,旧变量不可变规则依然生效。


元组与数组

// 元组:固定长度,可以不同类型
let tup: (i32, f64, bool) = (500, 6.4, true);
let (x, y, z) = tup;     // 解构
println!("{}", tup.0);    // 点语法访问
 
// 数组:固定长度,相同类型(栈上)
let a: [i32; 5] = [1, 2, 3, 4, 5];
println!("{}", a[0]);     // 0 → panic if out of bounds
 
// Vec:动态大小(堆上),类似 JS Array
let mut v = vec![1, 2, 3];
v.push(4);
println!("{}", v[3]);     // 4

函数与表达式

Rust 里,代码块 {} 是表达式,最后一行无分号就是返回值:

fn add(a: i32, b: i32) -> i32 {
    a + b  // 没有 return,没有分号——这是返回值
}
 
// if 也是表达式
let result = if x > 0 { "正数" } else { "非正数" };
 
// 块表达式
let y = {
    let x = 3;
    x + 1  // y = 4
};

加了分号就是语句,没有值。如果你函数返回了 () 而你期望有值,检查最后一行是否不小心加了分号。


实战项目:成绩计算器

实战项目

成绩计算器 CLI

30 分钟初级

解析命令行输入的分数列表,计算平均分,用 match 映射成绩等级,格式化输出。

整数/浮点数类型转换Vec 集合match 模式匹配函数组合命令行参数
cargo new grade-calc && cd grade-calc

实战视频

Rust 变量与类型系统
20 分钟精讲
0:00 / 0:00
CC
整数类型选择、字符串两种形式、表达式 vs 语句的核心区别。