表达式语言

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 }; // 可以