Rust 原生类型
Rust 原生类型
- Rust std 文档中关于 Primitive Types 的部分:https://doc.rust-lang.org/std/index.html#primitives
- Rust 程序设计语言 Data types 部分: https://doc.rust-lang.org/book/ch03-02-data-types.html
Rust 原生类型
Rust 的原生类型(primitive)分两种:标量类型(scalar type)和复合类型(compound type)
标量类型
分类 | 类型 | 特殊/说明 | 字面量 |
---|---|---|---|
有符号整型 | i8、i16、i32、i64 | isize (指针宽度) |
-16 |
无符号整型 | u8、u16、u32、u64 | usize (指针宽度) |
123 |
浮点型 | f32、f64 | 3.14 |
|
字符 | char | Unicode,一个 char 占4 字节 | 'A' |
布尔型 | true、false | true |
|
单元类型(unit type) | 一个空的元组:() |
单元类型的值是个元组,但不包含多个值,所以不是复合类型 | () |
复合类型
类型 | 字面量 | 说明 |
---|---|---|
数组(array) | [1, 2, 3] |
编译时确定固定类型、大小 |
元组(tuple) | (1, 0.2, true) |
有限、可异类型的序列 |
切片(slice) | 动态大小的序列视图 | |
字符串(str) | "abc" |
字符串切片 |
变量定义
用 let 名 = 值;
来声明变量,可以在变量名后加 :类型
来指定类型:
1 | let floatval: f64 = 1.0; |
不写类型说明就自动推断:
1 | let autoint = 12; |
字面值可以通过后缀指定类型:
1 | let intval = 5i32; |
Rust 还可以通过下文来推断:
1 | let mut autoi64 = 12; // 根据下一行的赋值推断为 i64 类型 |
用 let mut
来声明可变变量,mut 的变量值可在后面改变,但类型不能变。
注:变量可以被遮蔽(shadow)掉,遮蔽就可以变类型了:
1 | let mut mutable = 12; |
(这章重点是类型,不是变量,关于变量后面还会详细学习)
字面量与运算符
整数的字面量还可以加前缀来写二、八、十六进制:0b1010
,0o34
,0x12AB
。
还可以加下划线方便阅读:1_000_000 == 1000000
,0.000_001 == 0.000001
。
Rust 的运算符和 C 类似。包括:
- 短路求值的逻辑运算:与
&&
、或||
、非!
。 - 位运算:位与
&
,位或|
,异或^
,左移<<
,右移>>
。
元组
元组 (A, B)
是一些值的集合,其中的元素类型可以不同。
1 | let empty = (); |
用 {:?}
可以输出元组,但注意这个不支持太长的,超过 12 个值的元组就不能打印了:
1 | println!("{:?}\n{:?}\n{:?}\n{:?}", empty, single, more, nested); |
元组可以用做参数和返回值:
1 | fn reverse(pair: (i32, bool)) -> (bool, i32) { |
也可以用来定义匿名字段的简单结构体:
1 |
|
不含任何值的元组 ()
是一种单独的特殊类型,被称为单元类型,这种类型只有一个实例值,还是写作 ()
,这个值被称为单元值(unit value),没写 return 的函数就会返回这个值。
数组和切片
数组 [T; length]
是另一种集合,和元组不同,一个数组中的元素都具有相同类型 T
,这些元素对象在栈中连续储存。数组的大小 length
在编译时确定。
1 | let xs: [i32; 5] = [1, 2, 3, 4, 5]; |
数字访问越界,会在运行时 panic 退出:
1 | thread 'main' panicked at 'index out of bounds: the len is 2 but the index is 4' |
切片 &[T]
表示数组的一部分,一个切片对象由两个字组成:
- 指向底层数组的指针
- 切片的长度
1 | fn analyze_slice(s: &[i32]) { |