rust学习笔记(二)变量和类型
变量声明 let v1 :i32 = 10; rust官方说这有诸多优点,其实是方便编译器开发程序员。。
let 定义常量。可变常量需要加上mut。
let可以对变量重复定义成任意类型
let x = 1 let x = true
前面的语句为啥没有定义类型,这个功能就像c++的auto一样,自动推导了类型。
显示的定义别名
type tInt = u32; let x2 :tInt = 20;
静态变量
静态变量它的声明周期为整个程序运行期间
定义需要注意
- 必须马上初始化
- 初始化时必须编译器认为返回常量
- 允许加上mut但是必须使用unsafe
static AAA:i32 = 0; println!("{:?}", AAA); static mut AAA2 :i32 = 1; unsafe{ AAA2 = 21; println!("{:?}", AAA2); }
const定义常量: const G2 :i32 =0;
常用的数据类型和别的语言没啥大的差别
bool
char 不是1个字节是4个字节。需要使用1个字节可以使用u8数组
i8 u8 i16 u16 i32 u32 i64 u64 i128 u128 isize usize
整数溢出,rust提出了解决方案
- checked_* 返回None
- saturating_* 返回最大值
- wrapping_* 返回溢出的截断
f32 f64
浮点数可能返回特别的值需要注意了啊
enum FpCategory{
Nan, 空
Infinite, 无限大
Zero,0
Subnormal, 小数位超出位数收敛的情况
Normal 正常
}
指针类型和智能指针这些以后再说
Box<T> 有所有权,无权释放内存
&T 无权释放内存,无权写
& mut T 无权释放内存,有权写
*const T 只读指针,无权写
*mut T有权写
Rec<T>共享所有权,线程不安全
Act<T>原子型引用指针,共享所有权,线程安全
Cow<a,T> 写时复制
类型转换不支持隐式的转换,这种新语言有优势,使用as,后续一般使用标准库转换。
复合类型
tuple元组
let tup1 = (2131i32, "abc"); println!("{} {}", tup1.0, tup1.1);
有点奇妙的是允许定义空元组 let ept:() = () 占用内存空间为0
struct 结构
1 struct Poinit{ 2 x :i32, 3 y :i32, 4 } 5 let p = Poinit{x:1, y:2};
也有空结构 struct AA; struct AA2(); struct{};
type struct结构,没有名字的结构体
struct AA(i32,i32)
struct Age(i32); let age2 = Age(1); println!("{:?}", age2.0);
enum 主要用在匹配模式match一起使用
类型递归定义,不能包含自身。
类似c
type struct Node{ void *data; struct Node *next; } struct Rex{ data:i32, next:Box<Rex>, }