rust学习四、控制语句

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

rust的控制语句和大部分语言没有什么区别,都是熟悉的for,while,loop,if。
比较差别的是,在绝大部分非常流行的语言中都有的switch,rust是没有的。
诸如c/c++,java,javascript,c#。连PL/SQL都有case when语句。
 
一、基本的for、while、if,loop

示例-for,while,loop,if
  1. /**
  2.   学习控制流
  3.   条件  if
  4.   循环  for,loop,while
  5.        注意:for有各种各样的实现方式
  6. */
  7. use std::io;
  8. fn main() {
  9.     println!("请输入你的年龄");
  10.     let mut age = String::new();
  11.     io::stdin().read_line(&mut age).expect("读取失败");
  12.     let age: u32 = age.trim().parse().expect("请输入一个数字");
  13.     let mut desc = String::new();
  14.     let mut total: u32 = 0;
  15.     //1.0 测试 if ,else if
  16.     if (age < 20) {
  17.         println!("你是{}岁,还年轻", age);
  18.         total = cal_young(age);
  19.     } else if (age < 70) {
  20.         println!("你是{}岁,正当壮年,是国家和家庭栋梁", age);
  21.         total = cal_strong(age);
  22.     } else {
  23.         println!("你是{}岁!老骥伏枥,志在千里;壮士暮年,烈心不已", age);
  24.         total = cal_old(age);
  25.     }
  26.     //1.1 测试if 条件表达式赋值
  27.     //rust的函数和许多语句中,如果最后一个语句不带分号,往往表示返回值
  28.     desc = if age < 70 {
  29.         "壮年".to_string()
  30.     } else {
  31.         "老年".to_string()
  32.     };
  33.     println!("{}岁,属于{}", age, desc);
  34.     println!("总数={}", total);
  35.     //for 循环比较多实现方式
  36.     // a. in [] array  ,例如  in [1,2,3]
  37.     // b. in range   ,例如  in (1..10),但10不在内
  38.     if (age <= 50) {
  39.         let fib: u32 = calFb(age);
  40.         println!("{}的斐波那契值={}", age, fib);
  41.     }
  42.     test_for_with_array();
  43.     test_for_with_tuple();
  44. }
  45. //for循环-数组
  46. fn test_for_with_array() {
  47.     println!("for遍历数组");
  48.     for i in [1, 2, 3, 10] {
  49.         println!("数组元素:{}", i);
  50.     }
  51. }
  52. //for循环-元组,..
  53. //使用..的时候,两边带不带()都是一样的。带()主要是为了构建一个对象,便于左其它操作
  54. fn test_for_with_tuple() {
  55.     for i in (1..5) {
  56.         println!("{}", i);
  57.     }
  58.     for i in 6..10 {
  59.         println!("{}", i);
  60.     }
  61.     //倒数
  62.     //
  63.     for i in (1..10).rev() {
  64.         println!("倒数:{}", i);
  65.     }
  66. }
  67. fn cal_young(a: u32) -> u32 {
  68.     let mut total: u32 = 0;
  69.     //测试for循环
  70.     //注意 写成 n..m 那么上限是不会计算在内的
  71.     for i in 1..a + 1 {
  72.         total += i;
  73.     }
  74.     return total;
  75. }
  76. fn cal_strong(a: u32) -> u32 {
  77.     let mut i = 0;
  78.     let mut total: u32 = 0;
  79.     //测试loop,必须内部加break;
  80.     loop {
  81.         i = i + 1;
  82.         total = total + i;
  83.         if (i == a) {
  84.             break;
  85.         }
  86.     }
  87.     return total;
  88. }
  89. fn cal_old(a: u32) -> u32 {
  90.     let mut total: u32 = 0;
  91.     let mut i = 0;
  92.     //测试while
  93.     while i < a {
  94.         i = i + 1;
  95.         total = total + i;
  96.     }
  97.     return total;
  98. }
  99. /**
  100. 计算斐波那契,但是这个不要用于计算太大的值,因为这个递归算法极其低效
  101. 计算50以内还马马虎虎
  102. 注意:如果有错误,那么非蛇形的命名方式会被编译器提示出来
  103. */
  104. fn calFb(n: u32) -> u32 {
  105.     if (n == 1) {
  106.         return 1;
  107.     } else if (n == 2) {
  108.         return 1;
  109.     } else {
  110.         return calFb(n - 1) + calFb(n - 2);
  111.     }
  112. }
复制代码
 这其中for的格式比较多,许多语言都有这种现象,例如JAVA。
二、rust的for可以的格式

for i in n.m   使用它使用 std::iter::Range 或 std::iter::RangeInclusive 迭代器
for i in (n..m).rev()
for i in [x,y,z]
其它另有基于map,向量,枚举的便捷方式这些对象元素的方式
对于map,向量、枚举的,后续补充例子。
三、match而不是switch

在有关册本中,第一个例子就有match。
  1. match guess.cmp(&secret_str){
  2.             Ordering::Less => println!("偏小"),
  3.             Ordering::Greater => println!("偏大"),
  4.             Ordering::Equal => {println!("恭喜,你赢了!你总共花费了{}次",try_times);is_ok=true;}
  5. };
复制代码
按照文档的形貌,rust的match是一个比较奇特的东西。
match和JAVA17以上的switch照旧有一定相似度的,也不知道谁抄谁。
在rust的册本上把match吹了一番。
闲话少扯,照旧先把握match的一些基本内容吧。
四、小结

和大部分语言差不多,rust的控制布局没有特别的,这很好,因为它奇怪的语法已经够多了。
和现代大部分的语言语言一样,rust也力图让for循环变得更加方便一些。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表