Rust学习三 rust的数据类型

详细了解rust的数据类型,整型,浮点型,字符型,布尔,元组,集合等

Posted by rpl on February 9, 2020

通过此链接查看rust学习系列的其他文章

  1. rust的两种数据类型子集:标量类型和复合类型

  2. rust是静态语言,这表明rust在编译时必须清楚的知道所有变量的类型

一 Scalar Types 标量类型

4种标量类型: 整型,浮点型,布尔型, 字符型

1. Integer Types 整型

整型类型分为有符号整型和无符号整型

Length Signed Range(-2^n-1^ to 2^n-1^ - 1) Unsigned Range(0 to 2^n^ - 1)
8-bit i8 -2^7^ ~ 2^7^ -1 (-128 ~ 127) u8 0 ~ 2^8^ -1 (0 ~ 255)
16-bit i16 -2^15^ ~ 2^15^ -1 u16 0 ~ 2^16^ -1
32-bit i32 -2^31^ ~ 2^31^ -1 u32 0 ~ 2^32^ -1
64-bit i64 -2^63^ ~ 2^63^ -1 u64 0 ~ 2^64^ -1
arch isize 取决于计算机类型的体系结构 usize 取决于计算机类型的体系结构

arch 类型的 isize和usize类型取决于程序运行的计算机类型:如果是64位体系结构,则为64位; 如果是32位体系结构,则为32位

除了字节字面量之外,所有的数字字面量都允许使用类型后缀,如57u8, 此外可以使用_ 作为可视分隔符。如: 1_000, 100_0000.

Number literals Example
Decimal 98_222
Hex 0xff
Octal 0o77
Binary 0b1111_0000
Byte(u8 only) b’A’

如果我们不确定使用哪种类型的整型,一般rust会默认选择最优的类型:i32。这种类型运行速度最快,即使是64位的操作系统。而usize/isiz主要是在为某种集合建立索引的情况下使用。

2. Floating-Point Types 浮点型

  1. rust主要有单精度浮点和双精度浮点这两种浮点类型, 分别是f32f64对应代表32位单精度和64位双精度。

  2. rust默认使用f64, 虽然目前的CPU运行32位与64位浮点型的速度及无差别,但是64位能捕获更高的精度。

3. The Boolean Type 布尔类型

rust的布尔类型是: ture 和 false

4. The Character Type 字符类型

  1. char字符类型使用 单引号, string字符串使用的是 双引号
  2. rust的字符是Unicode编码。

二 Compound Type 复合类型

1. The Tuple Type 元组类型

  1. rust通过在圆括号内使用逗号分隔列表值来创建一个元组,元组内的每个元素的类型可以是不同的。
    1
    2
    3
    
     fn main() {
         let tup: (i32, f64, u8) = (500, 6.4, 1); 
     }
    

    类型注释是可选的。

  2. 元组解包 destruct:
    1
    2
    3
    4
    5
    
     fn main() {
         let tup = (500, 6.3, 1);
         let(x, y, z) = tup;
         println!("y is : {}", y);
     }
    
  3. 元组也可以通过 . + 下标索引的方式访问元组的元素:
    1
    2
    3
    4
    5
    6
    
     fn main() {
         let tup = (500, 6.4, 1);
         let x = tup.0;
         let y = tup.1;
         let z = tup.2;
     }
    

2. The Array Type 数组类型

  1. rust通过在方括内使用逗号分隔列表值来创建一个数组,不同于元组,数组内的元素类型必须是一致的。

  2. 不同于其他编程语言,rust的数组的长度是固定的, 一旦声明过了,数组大小就不可再改变。
  3. vector 向量类型是一个可变的数组,如果不确定使用数组还是向量,推荐使用向量,因为数组一旦声明,大小就不可修改。

  4. 通过[索引]访问数组元素:
    1
    2
    3
    4
    5
    6
    
    fn main() {
        let a = [1,2,3,4,5];
           
        let x = a[0];
        let y = a[1];
    }
    
  5. 数组的越界访问,编译器不会检查出错误,但运行时会报错退出。在程序试图通过下标访问一个元素时,rust会检查索引是否小于数组的长度,超出就会报错退出。这是rust安全性的一种体现。因为其他低级语言访问超出的下标可能会直接拿到内存中其他的数据。rust阻止了这一访问,保护了内存安全。

三 words, statements and translation

  1. You can write integer literals in any of the forms shown in Table 3-2. Note that all number literals except the byte literal allow a type suffix, such as 57u8, and _ as a visual separator, such as 1_000.

    你可以用表3-2所示的任何形式来编写整数字面值。注意,除了字节字面值之外,所有数字字面值都允许使用类型后缀(如57u8)和_作为可视分隔符(如1_000)。

    1
    2
    3
    4
    
     number literal 数字字面值
     byte literal 字节字面值
     type suffix 类型后缀
     visual separator 可视分隔符
    
  2. The primary situation in which you’d use isize or usize is when indexing some sort of collection.

    使用isize或usize的主要情况是为某种集合建立索引。

  3. pattern matching 模式匹配