Rust函数
首先我们对之前了解到的Rust的所有权进行回顾哈:
fn main() { // 程序入口 println!("Hello, world!"); let y = "xxxx".to_string(); // let y1 = String::from("xxxx") another_function(y); // 这里传入y后,将所有权给了函数,函数并没有返回值,所以之后不能使用y // println!("The y: {:?}", y); // 所有权转移,无法再使用y let y = String::from("xxx2x"); other_function(&y); // 引用借用了所有权,y还可以使用 println!("y: {}", y); let y1 = 2; // 对于一些标量和变量基础自带类型,整型、布尔等无论是否传入函数或者是否返回,都可以使用,因为是在栈中,只有这个函数消失/执行完了,才销毁 int_function(y1); println!("y1: {}", y1); // 可以 let array = [2; 3]; array_function(array); println!("array: {:?}", array); // 可以 } fn another_function(x: String) { // 函数必须对形参有类型约束 println!("The x: {}", x); } fn other_function(x: &String) { println!("The y2: {}", x); } fn int_function(x: i32) { println!("The int : {}", x); } fn array_function(y: [i32; 3]) { println!("array: {:?}", y); }
函数的基础概念比较简单,就是需要注意,每个函数的形参要有数据类型指定,使用多个时需要使用,分割。
包含语句和表达式的函数体
函数体由一系列的语句和一个可选的结尾表达式构成,语句(statements)是一个执行一些操作但不返回值的指令,表达式(expressions)计算并产生一个值。使用let关键字创建变量并绑定一个值是一个语句,如:let y = 6; 但是由于语句不能包含返回值,所有let 语句不能赋值给另一个变量:let x = (let y = 6);
fn main() { // 程序入口 println!("Hello, world!"); let x = 5; let y = { let x = 5; x +1 // 不写;表示默认是他返回 }; println!("y: {}",y); }
由于在定义y的时候,那个{}的代码块最后没有添加;,这使得它整体变成了表达式,如果加了;则表示是个语句。(表达式没有;)
具有返回值的函数
函数可以通过->来声明要返回的数据类型,在Rust中,函数的返回值等同于函数体最后一个表达式的值,使用return关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。
fn main() { // 程序入口 let x = five(); println!("The value of x: {}", x); let y = plus_one(6); println!("The value of y: {}", y); } fn five() -> i32 { 5 } fn plus_one(x: i32) -> i32 { x + 1 }
控制流程
if表达式允许根据条件执行不同的代码分支。需要注意的是,Rust中只支持bool的if判断,其他语言中如果非空则为真,但是Rust只认为true/false。
fn main() { // 程序入口 let number = 3; if number < 5 { println!("coundition was true"); } else { println!("condition was false"); } }
多重条件判断
可以使用else if 表达式与if 和 else 组合来实现多重条件,例如:
fn main() { // 程序入口 let number = 6; if number % 4 == 0 { println!("number is divisible by 4"); } else if number % 3 == 0 { println!("number is divisible by 3"); } else { println!("number is divisible no "); } }
let语句和if结合
因为if是表达式,我们可以在let语句的右侧使用它,例如:
fn main() { // 程序入口 let condition = true; let number = if condition { 5 } else { 6 }; // 注意这个5,6必须是同一类型,如果一个是5,一个是“six”是报错的 println!("The value of number is:{}", number); }
循环
Rust有三种循环:loop、while和for,首先我们先试试loop。loop关键字告诉Rust一遍又一遍地执行一段代码。
fn main() { let mut counter = 0; // 如果使用 let counter = 0,不使用mut的话,会陷入一个死循环 loop { counter += 1; if counter == 10 { break; } // 下面的的方式是错误的 // let counter = counter + 1; println!("The counter: {}", counter); } }
从循环中返回,loop的一个用例是重试可能会失败的操作,比如检测线程是否完成了任务,然而你可能需要将操作结果传递出去,这时候就需要break表达式了。
fn main() { let mut counter = 0; // 如果使用 let counter = 0,不使用mut的话,会陷入一个死循环 let ret = loop { counter += 1; if counter == 10 { break counter; } }; println!("The counter: {}", ret); //10 }
while循环
Rust语言中可以通过组合loop、if、else和break,实现不同的程序控制效果,下面我们来展示哈while循环相关的代码把。
fn main() { let mut number = 0; while number != 0 { println!("{}", number); number = number - 1; } println!("OUT"); let a = [10, 20, 34, 56]; let mut index = 0; while index < 4 { println!("the value is: {}", a[index]); index = index + 1; } }
for循环
for循环的安全性和简洁性使得它成为Rust中使用最多的循环结构。
fn main() { let a = [10, 20, 34, 56]; for element in a.iter() { println!("the value is: {}", element); } // 上面代码的优势在于for循环,更加安全,因为消除了由于超出数组结构或便利长度带来的bug // 对元素元素倒序 for number in (1..12).rev() { println!("number: {}", number); // 11,10...,1 } println!("Out") }