Rust 语言表达式
学习要点:
- 理解 Rust 语言表达式
- 掌握 Rust 语言几种常见的表达式
这篇文章我们将学习 Rust 语言表达式语法,即条件判断、循环、函数调用。Rust 与常见的 C 家族语言的一个区别在于 Rust 条件或循环语句也有返回值,这种设计起源于 Lisp 语言。
if
表达式#
Rust 语言的条件判断表达式与常见的语言没有区别:
fn main() {
let n = 5;
if n < 0 {
print!("{} is negative", n);
} else if n > 0 {
print!("{} is positive", n);
} else {
print!("{} is zero", n);
}
}
值得注意的是 if
后面布尔表达式的值只能是 bool
类型,不能是 0 或者其他的。
Rust 语言的条件表达式还有一个好用的功能,就是能返回值,就好像一个分段函数一样:
fn main() {
let n = 5;
let flag = if n < 0 {
-1
} else if n > 0 {
1
} else {
0
};
println!("{}", flag);
}
注意事项:
- 如果分支用最后一个语句返回值,末尾不要加分号;如果加了分号,返回值会变成
()
。 - Rust 没有所谓的
:?
三元运算符,因为有更加强大的条件表达式。 - 判断语句分支返回的值类型要一样,这意味如果一个分支返回值,所有分支都要返回值。
match
表达式#
match
表达式与 C 语言家族的 switch
语句类似:
fn main(){
let state_code = "MH";
let state = match state_code {
"MH" => {println!("Found match for MH"); "Maharashtra"},
"KL" => "Kerala",
"KA" => "Karnadaka",
"GA" => "Goa",
_ => "Unknown"
};
println!("State name is {}",state);
}
💡 解释:
_
代表默认的、其他的,即default
。- 可以用
|
枚举多个,例如"ZH" | "CN" =>"China"
。
match
表达式用于枚举体会非常方便:
enum WebEvent {
PageLoad,
PageUnload,
KeyPress(char),
Paste(String),
Click { x: i64, y: i64 },
}
fn inspect(event: WebEvent) {
match event {
WebEvent::PageLoad => println!("page loaded"),
WebEvent::PageUnload => println!("page unloaded"),
WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
WebEvent::Paste(s) => println!("pasted \"{}\".", s),
WebEvent::Click { x, y } => {
println!("clicked at x={}, y={}.", x, y);
},
}
}
fn main() {
let pressed = WebEvent::KeyPress('x');
let pasted = WebEvent::Paste(String::from("my text"));
let click = WebEvent::Click { x: 20, y: 80 };
let load = WebEvent::PageLoad;
let unload = WebEvent::PageUnload;
inspect(pressed);
inspect(pasted);
inspect(click);
inspect(load);
inspect(unload);
}
这个例子可能有些复杂,从以上例子可以总结如下几点:
- 枚举体的选项使用
::
指定; - 枚举体有值选项的构造方法:
let pressed = WebEvent::KeyPress('x');
,空值选项的构造方法:let load = WebEvent::PageLoad;
- 可以用
match
语句的选项析构枚有值举体。
if let
表达式#
if let
表达式是 match
表达式的一种特殊情况:
let optional = Some(7);
match optional {
Some(i) => {
println!("value: {:?}", i);
},
_ => {
println!("Get None.");
},
};
上面的式子可以简写为:
let optional = Some(7);
if let Some(i) = optional {
println!("value: {:?}", i);
} else {
println!("Get None.");
}
这样写意义更加明确,可以理解为:如果这样就……,不然就…….。多用于错误处理。
循环表达式#
理解了条件表达式后,理解循环表达式就会简单很多,Rust 共有四种循环方式:
while condition {
block
}
for pattern in collection {
block
}
loop {
block
}
while let pattern = expr {
block
}
请看一个例子:
fn main() {
let mut optional = Some(0);
while let Some(i) = optional {
if i > 9 {
println!("Greater than 9, quit!");
optional = None;
} else {
println!("`i` is `{:?}`. Try again.", i);
optional = Some(i + 1);
}
}
}
❓ 为什么 Rust 语言有了 while true {}
,还有专门设计 loop {}
语句呢?
本作品采用《CC 协议》,转载必须注明作者和本文链接