rust 里的复合类型比较重要,需要牢牢掌握。


字符串

首先是字符串类型。和其他语言有较大的区别,rust 里的字符是 unicode 类型;字符串是 UTF-8 编码。前者是每个字占用固定的 4 字节,后者所占用空间在 1~4 之间不定。

对于字符串,rust 也有两种类型:String&str

这两种类型之间的转换如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//&str -> String
String::from("hello,world")
"hello,world".to_string()

//String -> &str
fn main() {
let s = String::from("hello,world!");
say_hello(&s);
say_hello(&s[..]);
say_hello(s.as_str());
}
fn say_hello(s: &str) {
println!("{}",s);
}

关于操作字符串的函数,此处不赘述,详情见链接


元组

这是比较简单的符合类型,通过小括号将不同的类型合在一起。

1
2
3
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}

元组的默认顺序是从 0 开始排布,所以可以用.来访问。
也可以通过模式匹配:

1
2
3
4
5
6
7
fn main() {
let tup = (500, 6.4, 1);

let (x, y, z) = tup;

println!("The value of y is: {}", y);
}

数组

rust 里的数组和字符串一样,有两种类型需要区分。分别是 array(数组)和 vector(动态数组)。动态数组和其他语言里的数组功能类似。

第一种数组的特性:

  • 长度固定
  • 元素必须有相同的类型
  • 依次线性排列

创建“数组”

1
2
3
fn main() {
let a = [1, 2, 3, 4, 5];
}

创建“动态数组”

1
2
3
4
5
//1
let v: Vec<i32> = Vec::new();
//2
let v = vec![1, 2, 3];


结构体

关于结构体的创建和修改函数,参考此处链接
举例:

1
2
3
4
5
6
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}

其中比较特殊的有:

  • 元组结构体
  • 单元结构体

关于结构体的所有权变化需要注意


枚举

枚举是重要的概念,需要牢记!参考链接

一般用法,以扑克牌为例

1
2
3
4
5
6
enum PokerSuit {
Clubs,
Spades,
Diamonds,
Hearts,
}

另外比较重要的一个用法是 option 枚举,这个枚举可以用来解决 null 的问题。

1
2
3
4
enum Option<T> {
Some(T),
None,
}

以上只是粗略概括,重点需要关注的是每个类型的属性,注意可变和不可变,还有所有权改变的条件。