String

发布时间: 更新时间: 总字数:751 阅读时间:2m 作者: IP上海 分享 网址

Rust中字符串通常指String&str(字符串切片),他们都采用UTF-8编码。

介绍

字符串

字符串是一组基于Byte的组合,Rust 中 String 内置一些方法,可以操作字符串。

Rust 只有一个字符串类型:字符串切片 str(通常以 &str 字符串切片引用 使用)

字符串切片

对存储在其他地方、UTF-8 编码的字符串的引用

String 类型

Rust标准库中,提供String类型,采用 UTF-8 编码,来对字符串进行操作,如增加、修改、拥有等。

其他类型的字符串

Rust 标准库还提供其他类型的字符串,如:OsString、OsStr、CString、CStr,他们可以存储不同编码的文本且在内存中以不同的形式展现

String

创建空字符串

使用 String::new()

let mut s = String::new();  // mutable string

创建初始值的字符串

  • "xxx".to_string()
  • String::from("xxx")
let s1 = "hello world!".to_string();
let s2 = String::from("hello world!");

更新 String

  • push_str() 方法:将一个字符串切片附加到 String
  • push() 方法:将单个字符附加到 String
  • +:拼接字符串,String类型 + String类型引用
    • 使用类似如下签名的方法:fn add(self, s: &str) -> String {}
  • format! 拼接多个字符串,format 不取的任何参数的所有权
let mut s1 = String::from("hello world!");
let mut s2 = String::from("foo");
s1.push_str(&s2);  // 不获取 s2 的所有权

s1.push('b');  // 附加字符

let s3 = s1 + &s2;  // s1 的所有权释放,s2 的所有权保留

let s3 = format!("{}-{}", s1, s2);

String 不支持索引访问

  • 使用索引访问报错:String cannot be indexed by {integer}

  • 无法保证索引操作的耗时?

  • String 本质是 Vec<u8> 的包装,

    • 可以通过 .len() 方法获取字符串长度(和Unicode标量值有关)
      • 一个汉字的len为3
    • .bytes() 获取字节的遍历器
    • .chars() 返回类型为 char(Unicode标量值) 的遍历器

Rust 有三种表示字符串的方法:

  • 字节 Byte
  • 标量值 Scalar Values
  • 字形簇 Grapheme Clusters,最接近字母,标准库不提供对应的方法

String 切割

  • 使用 [] 和一个范围可以切割字符串切片
    • 必须按字符边界切割,否则 panic
let hello = "helo world!";  // 注意:一些字符占多个字节,可能报错:panicked at byte index x is not a char boundary
let s = &hello[1..3];

String 遍历

  • chars() 方法获取标量值
  • bytes() 方法获取字节
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数