1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{% note info %}
实际上rust核心中一般使用str类型,很少出现string,这种是在编译库中实现的
{% endnote%}
//1.创建一个空string
//2.通过字面值创建一个string
//2.1 使用string::from()
//2.2 使用str的方式
//3. 更新string
//3.1 push_str
//3.2 push
//3.3 使用"+"合并字符串
//3.4 使用format
//4. string索引
//5. str索引
//6. 遍历
//6.1 chars
//6.2 bytes
fn main() {
//1.
let mut s0 = String::new();
s0.push_str("hello");
println!("s0 = {}",s0);

//2.
//2.1
let s1 = String::from("init some thing");
println!("s1 = {}",s1);
//2.2
let s1 = "init som thing".to_string();
println!("s1 = {}",s1);
//3.
//3.1
let mut s2 = String::from("hello");
s2.push_str(",world");
println!("s2 = {}",s2);

let ss = "!".to_string();
s2.push_str(&ss);//使用ss的引用值
println!("s2 = {}",s2);
println!("ss = {}",ss);//并没有拿走字符串ss的所有权
//3.2
//push只能添加一个字符
let mut s2 = String::from("tea");
s2.push('m');
//仍然报错,因为双引号代表引用
//s2.push("mx");
println!("s2 = {}",s2);

//3.3合并字符串
let s1 = "hello".to_string;
let s2 = String::from(",world");
let s3 = s1 + &s2;
println!("s3 = {}",s3);
//s1已经不能够使用,因为s1所有权给了s3
//println!("s1 = {}",s1);
println!("s2 = {}",s2);
//3.4
let s341 = String::from("tic");
let s342 = String::from("tac");
let s343 = String::from("toe");
let s344 = format!("{}-{}-{}",s341,s342,s343);//format宏和println宏类似,
//但是format是给到变量,而println!是给到std::out。
println!("s344 = {}",s344);
//4.
let s4 = String::from("hello");
let s41 = s4[0];//string不能被索引
println!("s4.len = {}",s4.len());

//使用utf-8编码,所以汉字长度为3个字符
//没法对齐,所以不能获取索引
let s4 = String::from("你好");
println!("s4.len = {}",s4);
//5.
//但是使用str(slice)可以
let hello = "你好";
let h5 = &hello[0..3];
println!("h5 = {}",h5);
//但是不能够取到非边界。
//let h6 = &hello[0..2];
//println!("h6 = {}",h6);

//6.
//chars
for c in s4.chars() {
println!("c = {}",c);
}
//bytes
//按照字节打印
for b in s4.bytes() {
println!("b = {}",b);
}
}