函数

函数定义

在 Rust 中,用 fn 关键字来定义函数。

fn my_function() {
    println!("Hello, world!");
}
fn main() {
    my_function();
}

下面是一个带参数的函数,在函数入参区,先定义参数名,然后在定义参数的类型:

fn my_function(name: &str){
    println!("hello,{}",name);
}
fn main(){
    my_function("world");
}

函数返回值

函数可以将值返回给调用它们的代码。我们不命名返回值,但我们必须在箭头 -> 之后声明它们的类型。在 Rust 中,函数的返回值与函数体块中的最终表达式的值同义。可以通过使用 return 关键字并指定一个值来提前从函数返回,但大多数函数会隐式返回最后一个表达式,如下面的例子:

fn my_function() -> i32{
    9
}
fn main(){
    let x=my_function();
    println!("{x}");
}

可以看到,我们的 my_function() 函数并没有使用 return 关键字来返回指定的值,这样的话 Rust 会隐式返回最后一个表达式的值。注意这边最后一个表达式的值末尾不能带 ; 符号。

函数返回多个值

如果我们想返回多个值的时候,我们可以用元组来返回,然后在调用的时候进行解构:

fn my_function() -> (i32,f32){
    (9,3.14)
}
fn main(){
    let (x,y)=my_function();
    println!("x: {}\ny: {}",x,y);
}

if 语句

if 语句中的判断条件不需要用括号包围,但是代码块需要用大括号包围。

#![allow(unused)]
fn main() {
let x = 3;

if x == 7 {
    println!("x is 7");
} else {
    println!("x is not 7");
}
}

也可以使用 else if 语句来添加判断条件

#![allow(unused)]
fn main() {
let x = 3;

if x == 7 {
    println!("x is 7");
} else if x == 8 {
    println!("x is 8");
}else {
    println!("x is not 7 or 8");
}
}

在让我们看看下面的例子:

#![allow(unused)]
fn main() {
// ❌ 错误写法
let condition = true;
let mut x = condition?3:5;
println!("x is {}",x);
}

如果熟悉其他语言的朋友就知道这是一个标准的三元表达式,是不是感觉这样写没什么问题?但是当我们执行代码时却会发生错误。

在 Rust 中,可以用 if 语句来实现类似的表达式

#![allow(unused)]
fn main() {
let condition = true;
let y = if condition { 3 } else { 5 };
println!("y is {}",y);
}

循环

Rust 中有三种循环:loop、while 和 for。 这三种循环各有各的侧重点:

  • loop:如果需要无限循环,且不需要退出循环时(当然在 loop 中可以用 breakcontinue 来退出当前循环或整个循环 ),可以使用 loop 循环。像比如端口监听,我们可以使用 loop 循环来监听端口,直到收到一个新的连接。loop 循环还可以拥有返回值,可以将它赋值给一个变量。
  • while:如果需要循环,但是当满足某个条件要退出时,可以使用 while 循环。
  • for:如果要遍历一个数组时,可以用 for 循环。

loop 语句

最基础的用法:

loop {
    println!("more and more!")
}

上面代码会不断的输出 more and more!,如果要停止输出,只能终止这个程序运行。

跳出 loop 循环

当然我们也可以在 loop 循环体里添加 if 语句,然后用 break 跳出循环。

#![allow(unused)]
fn main() {
let mut x = 0;
loop {
    if x >= 5{
        break;
    }
    println!("more and more!");
    x += 1;
}
}

上面代码只会输出 5 遍 more and more!,然后就跳出循环。

loop 循环返回值

loop 还有一特性是它可以在结束循环时,使用 break 返回一个值

#![allow(unused)]
fn main() {
let mut x = 0;
let y = loop {
    if x >= 5{
        break "kill";
    }
    println!("more and more!");
    x += 1;
};
println!("{y}");
}

loop 循环嵌套标签

当我们有多个 loop 循环嵌套时,我们可以为 loop 循环定义一个标签,然后使用 break 来跳出指定标签下的循环。

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;

        'remain:loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

标签的命名以符号 ' 开头。

while 语句

在上面的 loop 循环中,我们通过在循环体中编写 if 语句来判断是否跳出循环体,如果你不想编写 if 语句,那么可以考虑使用 while 循环。

#![allow(unused)]
fn main() {
let mut x = 0;
while x < 5 {
    println!("hello");
    x+=1;
}
}

while 循环也支持嵌套写:

#![allow(unused)]
fn main() {
let mut x = 0;
while x < 2 {
    println!("hello");
    x += 1;
    let mut y = 0;
    while y < 3{
        println!("world!");
        y += 1;
    }
}
}

while 循环也可以使用循环标签,通过 break 跳出指定循环:

#![allow(unused)]
fn main() {
let mut x = 0;
'is_x:while x < 2 {
    println!("hello");
    x += 1;
    let mut y = 0;
    'is_y: while y < 3{
        println!("world!");
        if y == 1{
            break 'is_x;
        }
        y += 1;
    }
}
}

for 语句

如果要遍历一个数组或字符串时,可以用 for 循环。

#![allow(unused)]
fn main() {
let arr = [1,3,5,7,9];
for i in arr {
    println!("curr is {}",i);
}
}

或者这样

#![allow(unused)]
fn main() {
for i in 1..5 {
    println!("curr is {}",i);
}
}