这里的 <T> 语法是一个泛型参数,虽然目前还没学习到,但相信各人也不生疏,泛型在其它编程语言中也是很常见和紧张的存在。这里的 None 就表示没有值,肯定程度上等价于 Null 的作用。
2. match 控制流结构
Rust 有一个叫做 match 的极为强大的控制流运算符,它答应我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面值、变量、通配符和许多其他内容构成;。match 的力气泉源于模式的表现力以及编译器查抄,它确保了所有可能的情况都得到处置惩罚。
假设有这样一个场景,如今要上海陆家嘴举行 2025 年天下第一武道大会,邀请了:
埼玉《一拳超人》
五条悟《咒术回战》
孙悟空《七龙珠》
漩涡鸣人《火影忍者》
贝吉塔《七龙珠》
蒙奇·D·路飞《海贼王》
这些著名高手来到场,如今要根据这些选手的战斗本领为他们做排名。
enum Hero {
Saitama,
Satoru,
Goku,
Naruto,
Bejita,
Ruffy,
}
fn rank(hero: Hero) -> u8 {
match hero {
Hero:Saitama => 1,
Hero:Satoru=> 2,
Hero:Goku=> 3,
Hero:Naruto=> 4,
Hero:Bejita=> 5,
Hero:Ruffy=> 6,
}
}
复制代码
[注]:这里主持人给的排名仅作为参考,并不具备实际意义,请根据各人本身内心估值来判定。也不要问为什么没有请某某某来,上海市举行方表示资金有限,请不起所有高手聚集此地。
好了,根据上面的简单例子相信各位也可以或许对 match 的功能相识一二,这里就有人站出来说了“这?这不就是 switch & case 语句嘛~”,欸,差不多,但是 rust 的 match 要更加强大一点,请继续往下看。
2.1. match 对绑定值的匹配
正如上文提到,罗列变量可以为其成员指定几乎任何类型,对这种情况 match 该怎样应对?
enum Hero {
Saitama(i32),
Satoru(i32),
Goku(i32),
Naruto(i32),
Bejita(i32),
Ruffy(i32),
}
// 整数表示其战斗力数值
fn power(hero: Hero) {
match hero {
Hero::Saitama(p) => {
println!("埼玉: {}", p);
},
Hero::Satoru(p) => {
println!("五条: {}", p);
},
Hero::Goku(p) => {
println!("悟空: {}", p);
},
Hero::Naruto(p) => {
println!("鸣人: {}", p);
},
Hero::Bejita(p) => {
println!("王子: {}", p);
},
Hero::Ruffy(p) => {
println!("草帽小子: {}", p);
},
}
}
fn main() {
let goku = Hero::Goku(12000);
power(&goku);
}
复制代码
rust 中答应这样的匹配,正如上述例子中,将会匹配到 goku 属于 Hero::Goku(p) 类型,并同时将其值绑定到了 p 变量,这样就可以获取其战斗力数值了。
2.2. Option 的匹配