表达式语言
Rust 属于表达式语言 , 如 if 和 match 是可以产生值的
let status =
if cpu.temperature <= MAX_TEMP {
HttpStatus::Ok
} else {
HttpStatus::ServerError // 服务器错误
};
match 表达式是可以作为函数参数传递的
println!("Inside the vat, you see {}.",
match vat.contents {
Some(brain) => brain.desc(),
None => "nothing of interest"
});
同样的 ,代码块也是可以产生值的
let display_name = match post.author() {
Some(author) => author.name(),
None => {
let network_info = post.get_network_metadata()?;
let ip = network_info.client_address();
ip.to_string()
} };
上面中 , None之后就是一个代码块 , 没有分号就是一个值 但是注意报错信息可能不太明显
声明
块里面可以存在任意的特性项声明, 如 fn , struct 自由度很高
if 和 match
if 和 match 可以匹配表达式,然后对匹配的内容返回
let suggested_pet = if with_wings { Pet::Buzzard } else { Pet::Hyena }; // 可以 let favorite_number =
if user.is_hobbit() { "eleventy-one" } else { 9 }; // 错误 let best_sports_team =
if is_hockey_season() { "Predators" }; // 错误
类似的 , match 也可以做到类似的事情
let suggested_pet =
match favorites.element {
Fire => Pet::RedPanda,
Air => Pet::Buffalo,
Water => Pet::Orca,
_ => None // 错误:不兼容的类型
};
接下来还有一个类似 if let 的形式 , 相当于是一个便携写法
if let Some(cookie) = request.session_cookie {
return restore_session(cookie);
}
循环
while while let loop for in
四种形式
for i in 0..20 {
println!("{}", i);
}
注意对于Rust ,循环是会转移所有权的
Rust 支持对循环打标签
'search:
for room in apartment {
for spot in room.hiding_spots() {
if spot.contains(keys) {
println!("Your keys are {} in the {}.", spot,room);
break 'search;
}
}
}
赋值
Rust 支持联合赋值, 不支持链式赋值 , 无递增或者递减运算符
类型转换
as 关键字
let x = 17; // x的类型是i32
let index = x as usize; // 转换为usize
也存在常用的自动转换
- &String 转为 &str
- &Box 类型 自动转为对应的类型
闭包
如果指定了返回类型,那么闭包块必须是一个块
let is_even = |x: u64| -> bool x % 2 == 0; // 错误
let is_even = |x: u64| -> bool { x % 2 == 0 }; // 可以