在 Rust 语言中,String 类型与 &str 类型之间有哪些本质区别?请分别说明它们在内存布局、所有权语义、可变性与操作行为上的不同,并给出各自最典型的使用场景。
考察说明
考查对 Rust 所有权模型下字符串类型设计及其适用场景的掌握。
回答思路
- 【回答框架 1】String 是拥有所有权的、可增长的 UTF-8 编码的堆上分配的字符串类型;&str 是对 UTF-8 字节序列的借用切片,本身不拥有数据,只包含指针和长度。
- 【回答框架 2】String 支持可变操作如 push_str、push、insert 等,内部容量 capacity 可以大于长度 len,可动态调整;&str 是不可变的借用视图,无法修改内容,但可以通过切片操作获得子串。
- 【回答框架 3】内存布局上,String 由指针、长度和容量三部分组成,数据存放在堆上;&str 包含指向字符串数据的指针和长度,数据可以在堆、栈或静态内存中。
- 【回答框架 4】场景上,需要拥有字符串数据、动态构建或修改时用 String;只读访问、函数参数、字符串字面量、字符串切片时用 &str,作为函数参数时 &str 更通用,可以接受 String 的借用。
- 【回答框架 5】转换关系上,String 可以通过 as_str 或 & 操作符得到 &str,&str 可以通过 to_string 或 String::from 转换为 String。
- 【关键点 1】String 拥有所有权且可变,&str 是借用且不可变。
- 【关键点 2】&str 是 String 的切片视图,无容量概念。
- 【关键点 3】函数参数优先使用 &str 以获得更广的兼容性。
- 【关键点 4】String 数据在堆上,&str 可指向多种存储位置。
- 【易错点 1】混淆 String 与 &str 的所有权关系,导致不必要的 clone 或借用错误。
- 【易错点 2】错误地尝试通过 &str 修改字符串内容。
- 【易错点 3】忽视 String 与 &str 的转换开销,在热点路径频繁转换。