rust个人学习(2)
**常用结构:**
**数组**:
[T;N]表示一个N个值的数组,每个值的类型都是T
数组在编译时确定大小,不能像数组追加元素,也不能缩短数组
数组方法有迭代元素、搜索、排序、填充、筛选
sort方法是在切片上定义的,会隐式地将数组作为切片的饮用&mut [T]
len也是切片方法
**向量**:
Vet<T>叫做T类型的向量,是一种可以动态分配、可扩展二点类型T的值序列
向量元素分配在堆上,因此可以随意缩放:向其中追加向量、删除元素,推入元素
创建向量最简单的方式是vec!宏
调用Vec!宏,相当于调用Vec::new创建一个新的空向量
Vec::new()是另一种创建向量的方法
基于迭代器产生的值可以创建向量let mut vt:Vec<i32>=(0..6).collect();
使用collet时要写明类型,因为collect可以构建多种集合
使用Vec::with_capacity代替Vec::new(),初始分配cap,可减少内存分配次数
可以在向量的任何位置随意插入或者删除元素,会导致插入前后的元素全部前移或者后移
push()方法push一个T类型的元素在向量末尾
pop()方法pop一个T类型的元素在向量末尾,返回值是Option<T>;如果向量为空,返回None,否则返回Some(v)
std::env::args().skip(1).collect();将命令行参数转换为字符串向量
向量转化为切片,只需&vecname
**切片**
&[T]和&mut [T]叫做T类型的共享切片和T类型的可修改切片
是对其他值,比如数组或者向量中部分元素序列的引用
&mut [T]允许读写元素,但不能共享
&[T]允许多个读者读取,但不允许修改元素
切片可以是任意长度,不能直接保存到变量中,也不能作为函数参数传递
切片永远只能按引用传递
切片的引用是一个胖指针,即一个双字宽的值,保存着指向切片第一个元素的指针和切片中元素的个数。
这三种类型的值v,v.len()返回v的元素数量,使用v[i]访问元素
rust会检查边界,越界会panic
i必须是usize值,其他类型都不能用作索引
**字符串类型**:
r"str"使用原始字符串无需转义
''字符串字面量里的单引号无需转义
字节字符串,b'G',字节字符串是u8值切片,相当于go语言的byte
字节字符串不是Unicode文本切片,只能包含ascii和\xHH转义序列
原始字节字符串,br""
rust字符串在内存中不是以char数组存储的,而是unicode字符序列,使用UTF-8可变宽度编码存储,每个ascii字符用一个字节存储,其他字符使用多个字节存储,比如一个汉字,使用3个字节存储
string是一个能够存储完好utf-8的Vec<u8>
&str字符串引用是无法修改的
需要在运行时修改,使用String
to_string()方法可以把&str转换为String,实质上是new一个String,复制&str的值
format!()宏用法与print!()相同,但是它相当于go语言的fmt.Sprint()函数,返回一个转换后的string,而非打印输出
没有formatln!宏,所以format!宏不会在末尾加上换行符
&str更适合作为函数参数
字符串支持==、!=、<、>等运算