跳转至

字符串

Rust的原生String类型,并不等价于Vec<u8>,而必须是合法的UTF-8串。如果不和外部交互,这几乎不会带来什么问题。但是如何要和C语言交互、和操作系统交互,就麻烦了。所以有很多meme调侃这一点。类型作为约束数据的规范,正是因为有这么多不统一的规范才有这么多不统一的类型。纵然很多时候不同的字符串规范只有细微的差距,但是为了程序的安全,考虑差距是必要的。

rust string meme

[!Note]
UTF-8串中,一个字符占的字节数是不固定的。所以对String进行索引操作的复杂度是O(n)。

String

几乎所有的编程语言都拥有字符串类型,也都会提供诸如查找、大小写转换等功能。Rust的标准库文档做的很好,此处不做复制粘贴,可以参考std::string::String

值得一提的事&strString的区别。

  • String 是一个可增长、可变、拥有所有权的 UTF-8 字符串类型。它在堆上分配内存,这意味着它可以在运行时扩展或缩减。
  • &str 通常称为字符串切片(string slice),是一个指向有效 UTF-8 序列的不可变引用。它通常指向字符串数据的一部分,这些数据本身可以存储在任何地方,如在另一个字符串、常量数据区或 String 中。&str 本身并不拥有它指向的数据。
  • 所以,从 &strString 的转换需要进行内存分配,通常通过 to_string()String::from() 实现,而将String转换成&str则基本没有开销。

类似于Python的format string,Rust有format!宏可以完成类似的工作。占位符也是{}

let name = "Alice";
let age = 30;
let sentence = format!("My name is {} and I am {} years old.", name, age);
println!("{}", sentence);

Regex

Rust并没有将正则表达式放进标准库,而是由第三方库regex实现。

use regex::Regex;

fn main() {
    let re = Regex::new(r"(\w+)-(\d+)").unwrap();
    let text = "Example-1234";

    match re.captures(text) {
        Some(caps) => {
            println!("Matched: {} {}", &caps[1], &caps[2]);
        }
        None => println!("No match found"),
    }
}

Serde

Serde 是序列化和反序列化的“标准框架”。