【Rust】字符串String类型学习

什么是String

  • Rust的核心语言中只有一个String类型,那就是String slice,str通常被当作是&str的借用。
  • String类型是通过标准库提供的,而不是直接编码到核心语言中,它是一个可增长的、可变的、utf-8编码的类型。
  • strString都是utf-8编码的。如果你想使用一个非utf-8编码的String,可以使用OsString

创建新的String

  • String实际上是通过包装bytes类型的vector实现的。

  • 使用new方法创建String:let mut s = String::new()

  • 使用to_string方法创建String:

    rust 复制代码
    let data = "initial contents";
    let s = data.to_string();
    let s = "initial contents".to_string();
  • 使用String::from方法创建字符串,let s = String::from("initial contents").

  • 根据指定的容量,创建一个空字符串let mut s = String::with_capacity(10);。当字符串长度小于10的时候,不会触发内存重分配。

  • 可以通过len方法查看字符串长度,通过capacity方法查看字符串容量。

  • 通过utf-8类型的vector创建字符串let s_from_vec = String::from_utf8(vec![0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd]);

  • 如果vector可能包含不合法的utf-8编码则可以用from_utf8_lossy,这将使用占位符替换不合法的utf8字符:

    rust 复制代码
        let invalid_utf8 = vec![0xff, 0xff, 0xff];
        let s_from_invalid_utf8 = String::from_utf8_lossy(&invalid_utf8);

更新String

Rust不允许使用下标访问字符串里面的单个字符

使用push_str和push追加字符串

rust 复制代码
let mut s = String::from("foo");
s.push_str("bar");
// s is foobar

push_str方法不会改变字符串的所有权

rust 复制代码
let mut s = String::from("lo");
s.push('l');
// s is lol

使用+操作符或者 format!宏连接字符串

rust 复制代码
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // note s1 has been moved here and can no longer be used
rust 复制代码
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");

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

扩大字符串容量

rust 复制代码
let mut s_origin = String::with_capacity(10);
s_origin.push('1');
s_origin.reserve(10);
println!("{}", s_origin.capacity()); \\ 容量至少是10+1,一般会多分配一些

迭代字符串的方法

  • 可以使用chars方法访问独立的UniCode字符。使用bytes方法访问每一个字节。
rust 复制代码
for c in "Зд".chars() {
    println!("{c}");
}

将String类型转为其他类型

  • 转为bytes数组
rust 复制代码
let s = String::from("hello");
let bytes = s.into_bytes();
  • 转为字符串切片&str
rust 复制代码
let tmp_s = String::from("hello");
let s_str = tmp_s.as_str();
相关推荐
One_T.37 分钟前
bug----jdk17使用JOL无法输出java对象的存储布局
java·开发语言·jvm·bug
friklogff1 小时前
【Rust光年纪】构建跨语言桥梁:深度解析Rust FFI绑定生成器及其应用
开发语言·后端·rust
Yasen.M2 小时前
python动画:实现贝塞尔曲线【bezier】
开发语言·python·数学建模·manim·数学动画·python动画
颜回.2 小时前
C# --- 异常处理(Exception Handling)
开发语言·c#
๑҉ 晴天2 小时前
Java中的异步编程与CompletableFuture
java·开发语言
王鑫的博客8863 小时前
TCP的报文段结构与TCP编程的小工具
linux·开发语言·网络·网络协议·tcp/ip
liuxin334455663 小时前
Swift代码生成:自动化编码的艺术与实践
开发语言·自动化·swift
这个男人叫小帅3 小时前
<C++> 多态
开发语言·c++
Fourier_xyz3 小时前
Floyd 判圈算法学习:Leetcode142. 环形链表 II,Leetcode287. 寻找重复数
学习·算法·链表·图论
guanpinkeji3 小时前
旧衣回收小程序系统,为市场发展提供新模式
java·开发语言·小程序·小程序开发·回收·旧衣回收·旧衣回收小程序