跳至主要內容

03-控制流和代码块

黑静美...大约 3 分钟编程rust

本文摘编自:快速入门:Rust中有哪些你不得不了解的基础语法?open in new window(著作权归AI悦创所有)

2. Rust 中的控制流

下面我们来了解一下 Rust 语言的控制流语句。

1. 分支语句 if else

Rust 中使用 if else 来构造分支。

fn main() {
    let number = 6;
    // 判断数字number能被4,3,2中的哪一个数字整除
    if number % 4 == 0 {
        println!("number is divisible by 4");
    } else if number % 3 == 0 {
        println!("number is divisible by 3");
    } else if number % 2 == 0 {
        println!("number is divisible by 2");
    } else {
        println!("number is not divisible by 4, 3, or 2");
    }
}

与其他 C 系语言不同,Rust 中 if 后面的条件表达式不推荐用 () 包裹起来,因为 Rust 设计者认为那个是不必要的,是多余的语法噪音。

还要注意一点,if else 支持表达式返回

fn main() {
    let x = 1;
    // 在这里,if else 返回了值
    let y = if x == 0 {
        // 代码块结尾最后一句不加分号,表示把值返回回去
        100
    } else {
        // 代码块结尾最后一句不加分号,表示把值返回回去
        101
    };
    println!("y is {}", y);
}

像上面这样的代码,其实已经实现了类似于 C 语言中的三目运算符这样的设计,在 Rust 中,不需要额外提供那样的特殊语法。

2. 循环语句

Rust 中有三种循环语句,分别是 loop、while、for。

loop 用于无条件(无限)循环。

fn main() {
    let mut counter = 0;
    
    // 这里,接收从循环体中返回的值,对result进行初始化
    let result = loop {
        counter += 1;
        if counter == 10 {
            // 使用break跳出循环,同时带一个返回值回去
            break counter * 2;
        }
    };

    println!("The result is {result}");
}

请仔细品味这个例子,这种返回一个值到外面对一个变量初始化的方式,是 Rust 中的习惯用法,这能让代码更紧凑。

while 循环为条件判断循环。

当后面的条件为真的时候,执行循环体里面的代码。和前面的 if 语句一样,Rust 中的 while 后面的条件表达式不推荐用 () 包裹起来。比如:

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{number}!");

        number -= 1;
    }

    println!("LIFTOFF!!!");
}

for 循环在 Rust 中,基本上只用于**迭代器**的遍历。

Rust 中没有 C 语言那种 for 循环风格的语法支持,因为那被认为是一种不好的设计。

你可以看一下下面的代码,就是对一个数组进行遍历。

for+ element+ in
fn main() { 
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {element}");
    }
}

上面代码对动态数组 Vec 的遍历阻止了越界的可能性,因此用这种方式访问 Vec 比用下标索引的方式访问更加安全。

对于循环的场景,Rust 还提供了一个便捷的语法来生成遍历区间: ..(两个点)。

请看下面的示例。

遍历

数字遍历
fn main() {
    // 左闭右开区间
    for number in 1..4 {
        println!("{number}"); //在for循环可以这么用,但是打印其他内容不可以
    }
    println!("--");
    // 左闭右闭区间
    for number in 1..=4 {
        println!("{number}");
    }
    println!("--");
    // 反向
    for number in (1..4).rev() {
        println!("{number}");
    }
}
// 输出
1
2
3
--
1
2
3
4
--
3
2
1
字符遍历(以英文字母顺序)
fn main() {
for ch in 'a'..='z' {
        println!("{ch}");
    }
}
// 输出:
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3