rust学习三、根本范例

宁睿  金牌会员 | 2024-10-29 16:17:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 943|帖子 943|积分 2839

本文内容摘自,作者:美国的steve klabnik ,Carol nichols。
中国工信出版社2020年出版,但在国外听说是2018年出版的。
关于本人的入门大部分来自此书。
不过此书由于出版的时间较早(假定是2018),那么那个时候的rustc的版本是1.30左右,以是在1.81的情况上还是具有不少的出入。
需要在完本钱书的根本学习之后,再研究1.81上的内容.
本文的目的在于作为一个条记,读者可以作为参考,也可以翻阅恣意博客或者网站上的。
一、概述

在作者的这个章节中,简单介绍了根本概念:

  • 变量与可变性
  • 数据范例
  • 数据范例-标量范例
  • 数据范例-复合范例
rust的数据范例远不止这些!
 
1.1、名称风格_蛇形

rust推荐用蛇形风格,这和java,c++之类的不同。
我个人认为蛇形还是比较人性化的,一方面提拔了输入速率,其次可能还更好阅读。
不过这个风格并非是强制的,但是rustc会多管闲事,在编译的时候给出不少警告。
 
二、变量与可变性

 这个变量的最重要概念之一,强调几点:
1.变量具有可变和不可变属性,和别的语言一样。但是rust默认是不可变
2.编辑器可以保证不能修改不可变变量,这是重点
别的语言也有这种情况,不过没有那么突出。别的语言中默认是可变的,而rust是默认可变的
例如在JAVA中
  1. int a=10;   
  2. final int b=20;  //不可变需要显示定义
  3. a=99;
  4. b=29; //这个会编译错误
复制代码
而rust是翻过来的:
  1. let score=100;   //默认不可变
  2. score=91;   //这个会编译报错
  3. let mut age=90;  //要可变,需要显示申明
  4. age=99;
复制代码
三、数据范例

原文只强调了一点:rust是静态范例语言,以是在编译的时候就需要知道所有变量的具体范例.
这就是静态范例语言的特点,好处是制止潜在的错误,严谨的语言一般都支持这个。
不严谨的,也搞了一些手段制止过于散漫导致的标题,例如js。用const,let来制止可能的标题。
python也是动态范例的。
c,C++,java也是静态范例语言.
四、数据范例-标量范例

所谓标量,即该范例主要是为了表示某种”量"。
在本文中,范围很狭窄,就是数量。
以是有以下几个标量范例:整数、浮点数(小数)、布尔、字符
留意,末了一个是字符,不是字符串.
有符号整数- i8/16/32/64/size ,分别表示8位,16位,32位,64位宁静台架构范例
无符号整数-u8/16/32/64/size ,分别表示8位,16位,32位,64位宁静台架构范例
浮点-f32,f64-rust默认推到字面量位f64,这是因为现代cpu更快,且f64提供更高的精度
字符(char)-但是它占据四个字节,是unicode,意味着可以展示各种语言的字符和一些表情包
留意,所谓平台架构范例usize,isize,它们和操作系统cpu架构有关。如果是64位的,则是64,否则就是32.暂时没有128之类的。
示例:
  1. fn main(){
  2.     //1.0 整数
  3.     let my_age: u8=90;   // 0~255
  4.     //let f_age:u8=300;    //溢出报错
  5.     let my_food_amount: u16=50000;   // 0~65535
  6.     let ys=my_food_amount%9;
  7.     let my_cells: u32= 1000000000;     //0~4294967295  ,即0到42亿
  8.     let star_qty: u64 = 9000000000000;          //0~18,446,744,073,709,551,615   即0~1844兆
  9.     let max:u128 =9292;
  10.     println!("my_age={},my_food_amount={},my_cells={},star_qty={},",
  11.     my_age,my_food_amount,my_cells,star_qty);
  12.     //    my_age=99; // 默认不可变,这样会爆编译错误
  13.     //2.0 浮点数,浮点数运算是否存在精度丢失问题?
  14.     let score:f32=90.4;            //-3.4 X 10³⁸-3.4 X 10³⁸
  15.     let money:f64=3.1415926532758; //-1.8 X 10³⁰⁸   -   1.8 X 10³⁰⁸
  16.     //3.0 布尔  ,占据一个字节
  17.     let is_ok=true;
  18.     let is_successful=false;
  19.     //4.0 字符类型,非字符串类型
  20.     let dog_tag:char='a';
  21.     //打印常见的120几个ascii字母
  22.     let mut str:String=String::from("");
  23.     let mut code:u8=0;
  24.     for i in 1..255 {
  25.         let ch=code as char;
  26.         str=str+&ch.to_string();
  27.         if (code%30==0){
  28.             println!("{}",str);
  29.             str=String::from("");
  30.         }
  31.         code += 1;
  32.     }
  33.     if (str!=""){
  34.         println!("{}",str);
  35.     }
  36.    
  37.     //演示重复定义一个变量,这在java这样的语言中是不允许的
  38.    
  39.     let cat="小白";
  40.     println!("{}",cat ); //
  41.     let cat=90;
  42.     println!("{}",cat);
  43.    
  44.     //字面表达标量类型
  45.     let a1=10_i32;
  46.     let a2=10.2_f32;
  47.     let a3=10.554_f64;
  48.     let a4=254u8;
  49.     let a5=99.88_f32;
  50.     println!("{},{},{},a4={},{}",a1,a2,a3,a4,a5);
  51. }
复制代码
示例中除了展示界说、访问范例,还增加了字面量表达范例的方法 .
在前例中,都是一些常见的,但我们也很感兴趣如何表示不同进制的数字(原文例子):
  1.     //字面量表达不同的整数
  2.     let d1=10;
  3.     let d2=0o10;     //8进制  0o开头
  4.     let d3=0x10;     //16进制 0x开头
  5.     let d4=0b01001;  //二进制 0b开头
  6.     println!("d1={},d2={},d3={},d4={}",d1,d2,d3,d4);
复制代码
打印结果如下:

五、数据范例-复合范例

复合范例,故名思意:该范例的值通常由多个标量范例组成。
本文提到了以下几个:
元组(tuple),用的名称同python一样. 不可变长,但元素个数范例可以不一样.。有点范例java的Object[]
数组,不可变长,要求成员范例必须一致,雷同java的 int[],char[]之类的
用于复合范例的时候,rust的语法还颇有python的样子,比较随意(也有人认为方便)
示例:
  1. fn main(){
  2.     //1.0 元组 tuple- 元素类型可以不同,个数不能变化
  3.     //定义方式常见有两种:指定每个元素的类型,或者不指定
  4.     //总之这个tuple不知有啥用,访问非常不方便,定义也非常灵活? 性能还是什么?
  5.     let i:u8=9;
  6.     let my_nums=(0,1,2,3,4,5,6,7,8,99);
  7.     let my_nums32:(u32,u32,u32,u32)=(1000,109393,29992,1992);
  8.     //访问元素的方式-使用点号加序号
  9.     println!("my_nums is:{}",my_nums.9);
  10.    
  11.     //匹配获取,但用于巨长的,并不适合
  12.     let tuple = (1, "hello", 3.14);  
  13.     let (a, b, c) = tuple;  
  14.     println!("a: {}, b: {}, c: {}", a, b, c);
  15.     //2.0 数组 array    - 元素类型必须一致,个数不能变化
  16.     //数组的定义方式足够灵活,访问的方式也更灵活,更接近大部分编程语言,即可以通过索引下标访问,索引从0开始
  17.     let score_arr=[10,20,30,40];
  18.     let food_arr=["大米","糙米","地瓜","包菜","白菜"];
  19.     for i in 0..food_arr.len() {
  20.         println!("第{}个食物:{}",i+1,food_arr[i]);
  21.     }
  22.    
  23.     //3.0
  24.     print_food(&food_arr);
  25. }
  26. fn print_food(foods:&[&str]){
  27.     for i in 0..foods.len() {
  28.       println!("第{}个食物:{}",i+1,foods[i]);
  29.     }
  30. }
复制代码
 
留意,上例中print_food的参数如果界说为 foods:[&str]那么会导致编译错误:doesn't have a size known at compile-time
 

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

宁睿

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

标签云

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