字符
🧵

字符

创建时间
Nov 3, 2024 02:56 PM
上次编辑时间
Last updated November 12, 2024
标签
rust
字符

字符串

  • Rust 中的 String 不能通过下标去访问,因为是以UTF-8存储的可变长编码,所以一个英文和一个汉字的需要的空间是不一致的。
  • Rust 中转义符号也是反斜杠 \
  • 禁⽌转义的字符串字⾯量 r#""#
  • 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 // \ "
notion image
  • 字符串字⾯量默认会存放在静态数据区⾥,⽽静态数据区中的字符串总是贯穿程序运⾏的整个 ⽣命期,直到程序结束的时候才会被释放。因此不需要某⼀个变量对其拥有所有权,也没有哪 个变量能够拥有这个字符串的所有权。所以上面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]