在学习 Rust 编程语言 的过程中,很多初学者都会对 String 和 str 感到困惑。它们看起来都和“字符串”有关,但用法、内存布局和所有权模型却大不相同。本文将用通俗易懂的方式,详细讲解 Rust String与str区别,帮助你彻底掌握这两个核心概念。
str 是 Rust 中的“字符串切片”(string slice),通常以 &str 的形式出现。它是一个不可变的、固定长度的 UTF-8 字符序列,存储在程序的只读内存区域(如字符串字面量)或堆上某段内存的一部分。
例如:
let s: &str = "Hello, world!"; 这里的 s 就是一个 &str,指向程序二进制中已存在的字符串数据。它不拥有数据,只是一个“视图”或“引用”。
String 是 Rust 标准库提供的一个可增长、可变、拥有所有权的 UTF-8 字符串类型。它在堆上分配内存,可以动态修改内容。
创建 String 的常见方式:
let mut s = String::from("Hello");s.push_str(", world!");println!("{}", s); // 输出: Hello, world! 注意:String 是 可变的(需用 mut 声明),并且 拥有其数据的所有权。
| 特性 | &str | String |
|---|---|---|
| 是否拥有数据 | 否(只是引用) | 是 |
| 可变性 | 不可变 | 可变(需声明 mut) |
| 内存位置 | 栈(指针)+ 只读内存/堆(数据) | 栈(元数据)+ 堆(实际字符串) |
| 大小 | 运行时确定(动态大小类型) | 编译时已知(24字节,含指针、长度、容量) |
在实际开发中,经常需要在 String 和 &str 之间转换:
&s 或 s.as_str().to_string() 或 String::from()// &str 转 Stringlet s1: &str = "hello";let s2: String = s1.to_string();// 或let s3: String = String::from(s1);// String 转 &strlet s4 = String::from("world");let s5: &str = &s4;// 或let s6: &str = s4.as_str(); 这体现了 Rust 的核心哲学:零成本抽象 和 内存安全。
&str 非常轻量,适合传递只读字符串(如函数参数),避免不必要的内存拷贝;而 String 提供了动态修改的能力,同时通过所有权系统确保内存安全,防止悬挂指针和数据竞争。
这也是 Rust内存管理 精妙之处:不同的字符串类型服务于不同场景,既高效又安全。
&str,这样既能接受 String 也能接受字符串字面量。String。.to_string() 调用,减少内存分配。// 推荐:使用 &str 作为参数fn greet(name: &str) { println!("Hello, {}!", name);}greet("Alice"); // 传入 &str 字面量greet(&my_string); // 传入 String 的引用 理解 Rust String与str区别 是掌握 Rust 编程的关键一步。通过本文,你应该已经清楚了它们的本质差异、使用场景和转换方法。无论是 Rust编程入门 还是深入学习 Rust内存管理,这个知识点都至关重要。
继续练习吧!多写代码,多思考所有权,你会越来越熟练地驾驭 Rust 的强大能力。
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126813.html