rust的控制语句和大部分语言没有什么区别,都是熟悉的for,while,loop,if。
比较不同的是,在绝大部分非常流行的语言中都有的switch,rust是没有的。
诸如c/c++,java,javascript,c#。连PL/SQL都有case when语句。
一、基本的for、while、if,loop
示例-for,while,loop,if- /**
- 学习控制流
- 条件 if
- 循环 for,loop,while
- 注意:for有各种各样的实现方式
- */
- use std::io;
- fn main() {
- println!("请输入你的年龄");
- let mut age = String::new();
- io::stdin().read_line(&mut age).expect("读取失败");
- let age: u32 = age.trim().parse().expect("请输入一个数字");
- let mut desc = String::new();
- let mut total: u32 = 0;
- //1.0 测试 if ,else if
- if (age < 20) {
- println!("你是{}岁,还年轻", age);
- total = cal_young(age);
- } else if (age < 70) {
- println!("你是{}岁,正当壮年,是国家和家庭栋梁", age);
- total = cal_strong(age);
- } else {
- println!("你是{}岁!老骥伏枥,志在千里;壮士暮年,烈心不已", age);
- total = cal_old(age);
- }
- //1.1 测试if 条件表达式赋值
- //rust的函数和许多语句中,如果最后一个语句不带分号,往往表示返回值
- desc = if age < 70 {
- "壮年".to_string()
- } else {
- "老年".to_string()
- };
- println!("{}岁,属于{}", age, desc);
- println!("总数={}", total);
- //for 循环比较多实现方式
- // a. in [] array ,例如 in [1,2,3]
- // b. in range ,例如 in (1..10),但10不在内
- if (age <= 50) {
- let fib: u32 = calFb(age);
- println!("{}的斐波那契值={}", age, fib);
- }
- test_for_with_array();
- test_for_with_tuple();
- }
- //for循环-数组
- fn test_for_with_array() {
- println!("for遍历数组");
- for i in [1, 2, 3, 10] {
- println!("数组元素:{}", i);
- }
- }
- //for循环-元组,..
- //使用..的时候,两边带不带()都是一样的。带()主要是为了构建一个对象,便于左其它操作
- fn test_for_with_tuple() {
- for i in (1..5) {
- println!("{}", i);
- }
- for i in 6..10 {
- println!("{}", i);
- }
- //倒数
- //
- for i in (1..10).rev() {
- println!("倒数:{}", i);
- }
- }
- fn cal_young(a: u32) -> u32 {
- let mut total: u32 = 0;
- //测试for循环
- //注意 写成 n..m 那么上限是不会计算在内的
- for i in 1..a + 1 {
- total += i;
- }
- return total;
- }
- fn cal_strong(a: u32) -> u32 {
- let mut i = 0;
- let mut total: u32 = 0;
- //测试loop,必须内部加break;
- loop {
- i = i + 1;
- total = total + i;
- if (i == a) {
- break;
- }
- }
- return total;
- }
- fn cal_old(a: u32) -> u32 {
- let mut total: u32 = 0;
- let mut i = 0;
- //测试while
- while i < a {
- i = i + 1;
- total = total + i;
- }
- return total;
- }
- /**
- 计算斐波那契,但是这个不要用于计算太大的值,因为这个递归算法极其低效
- 计算50以内还马马虎虎
- 注意:如果有错误,那么非蛇形的命名方式会被编译器提示出来
- */
- fn calFb(n: u32) -> u32 {
- if (n == 1) {
- return 1;
- } else if (n == 2) {
- return 1;
- } else {
- return calFb(n - 1) + calFb(n - 2);
- }
- }
复制代码 这其中for的格式比较多,许多语言都有这种现象,例如JAVA。
二、rust的for可以的格式
1.for i in n..m 使用它使用 std::iter::Range 或 std::iter::RangeInclusive 迭代器
2.for i in (n..m) 和 第1种形式一样
3.for i in (n..m).rev()
4.for i in [x,y,z] 和一种情况一样
其它还有基于map,向量,枚举的便捷方式这些对象元素的方式。
另外for中可以直接使用模式匹配,例如这样的语句:for (index, token) in input.clone().into_iter().enumerate()
对于map,向量、枚举的,后续补充例子。
三、loop的作用
loop的基本作业用和其它语言差不多。
在rust还可以和rust的奇怪语法结合,用于赋值语句中,例如:- let content = loop {
- match iter.next() {
- Some(TokenTree::Literal(lit)) => {
- // 找到字面量后返回
- let content_str = lit.to_string().trim_matches('"').to_string();
- println!("Parsed content: {}", content_str);
- break content_str;
- },
- Some(TokenTree::Punct(_)) => {
- // 遇到标点符号就继续循环
- continue;
- },
- None => panic!("未找到字符串参数"),
- _ => panic!("第一个参数必须是字符串"),
- }
- };
复制代码
如果读者看到这里,也不用畏惧,学到后面自然能理解,也能习惯这种奇怪的语法。
四、match而不是switch
在有关书籍中,第一个例子就有match。- match guess.cmp(&secret_str){
- Ordering::Less => println!("偏小"),
- Ordering::Greater => println!("偏大"),
- Ordering::Equal => {println!("恭喜,你赢了!你总共花费了{}次",try_times);is_ok=true;}
- };
复制代码 按照文档的描述,rust的match是一个比较奇特的东西。
match和JAVA17以上的switch还是有一定相似度的,也不知道谁抄谁。
在rust的书本上把match吹了一番。
闲话少扯,还是先掌握match的一些基本内容吧。
五、小结
和大部分语言差不多,rust的控制结构没有特别的,这很好,因为它奇怪的语法已经够多了。
和现代大部分的语言语言一样,rust也力图让for循环变得更加方便一些。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |