字符串
- Rust 中的
String
不能通过下标去访问,因为是以UTF-8存储的可变长编码,所以一个英文和一个汉字的需要的空间是不一致的。
String
是字符串的所有权形式,常常在堆中分配。String
字符串的内容⼤⼩是可以动态变化的。⽽str
是字符串的切⽚类型,通常以切⽚引⽤&str
是字符串的视图的借⽤形式。
fn main() {
let message = "message";
println!("{}", message);
let message = "message : \\ \"";
println!("{}", message);
let message = r#"message \ ""#;
println!("{}", message);
let message = r#"message1
message 2
\ ""#;
println!("{}", message);
}
//output
// message
// message : \ "
// message \ "
// message1
// message 2
// \ "
- 字符串字⾯量默认会存放在静态数据区⾥,⽽静态数据区中的字符串总是贯穿程序运⾏的整个
⽣命期,直到程序结束的时候才会被释放。因此不需要某⼀个变量对其拥有所有权,也没有哪
个变量能够拥有这个字符串的所有权。所以上面
static_zone
只是对静态数据区的一个切片引用。形式是&'static str
,这是静态数据区中的字符串的表示⽅法。
- 通过
to_string
将静态数据区中的字符串字⾯量拷⻉了⼀份到堆内存中,String
类型是拥有所有权的类型,所以此时heap_zone
是对堆区内的字符串享有所有权。
_heap_brrow
是heap_zone的不可变引用。,不会再把字符串内容复制⼀份。
_heap_slice
是对_heap_brrow的切片引用。切⽚就是⼀块连续内存的某种视图,它可以提取⽬标对象的全部或⼀部分,_heap_slice_part
就是对heap_zone切片的一部分视图。
字节串
- 字节串 ⽤ b 开头,双引号括起来。可以看到每个字母都以ASCII存储,若尝试输出中文则会报错。这种方式相较于
String
会更加的紧凑。
fn main() {
let bytestring: &[u8; 21] = b"this is a byte string";
println!("A byte string: {:?}", bytestring);
let escaped = b"\x52\x75\x73\x74 as bytes";
println!("Some escaped bytes: {:?}", escaped);
let raw_bytestring = br"\u{211D} is not escaped here";
println!("{:?}", raw_bytestring);
}
// ouput
A byte string: [116, 104, 105, 115, 32, 105, 115, 32, 97, 32, 98, 121, 116, 101, 32, 115, 116, 114, 105, 110, 103]
Some escaped bytes: [82, 117, 115, 116, 32, 97, 115, 32, 98, 121, 116, 101, 115]
[92, 117, 123, 50, 49, 49, 68, 125, 32, 105, 115, 32, 110, 111, 116, 32, 101, 115, 99, 97, 112, 101, 100, 32, 104, 101, 114, 101]