字符串与 &str
拥有所有权的文本与借用的文本
字符串与 &str 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
两种字符串类型
Rust 有两种主要的文本类型:
String— 拥有所有权且可增长的字符串。&str— 借用的字符串切片,是文本的一种视图。
fn main() {
let owned: String = String::from("hello");
let borrowed: &str = "world";
println!("{} {}", owned, borrowed);
}字符串字面量是 &str
使用双引号编写文本时,得到的是 &str。它是固定的,并存储在程序的二进制文件中。
fn main() {
let greeting = "Hi there"; // type is &str
println!("{}", greeting);
}创建 String
使用 String::from 或 .to_string() 方法创建拥有所有权的 String。
fn main() {
let a = String::from("abc");
let b = "xyz".to_string();
println!("{} {}", a, b);
}增长字符串
由于 String 拥有所有权且可以增长,因此您可以使用 push_str 和 push 向其中追加内容。
fn main() {
let mut s = String::from("Hello");
s.push_str(", ");
s.push_str("Rust");
s.push('!');
println!("{}", s);
}字符串拼接
使用 + 运算符或 format! 宏连接字符串。format! 不会消耗其输入。
fn main() {
let first = String::from("Hello");
let second = String::from("World");
let joined = format!("{} {}", first, second);
println!("{}", joined);
}将 String 借用为 &str
String 可以自动借用为 &str。这样,函数就可以接受任意一种类型。
fn print_text(text: &str) {
println!("text: {}", text);
}
fn main() {
let owned = String::from("owned");
print_text(&owned);
print_text("literal");
}为什么优先使用 &str 参数
函数通常接受 &str 而不是 String。这样更加灵活:调用者可以传入拥有所有权的字符串、字面量或切片。
fn shout(s: &str) -> String {
s.to_uppercase()
}
fn main() {
println!("{}", shout("quiet"));
}以字节为单位的长度
len() 方法返回的是字节长度,而不是字符数。ASCII 文本中的每个字符占用一个字节。
fn main() {
let s = "hello";
println!("{} bytes", s.len());
}检查内容
有用的读取方法包括 contains、starts_with 和 is_empty。
fn main() {
let s = "hello world";
println!("{}", s.contains("world"));
println!("{}", s.starts_with("hello"));
}所有权差异
String 在堆上拥有自己的数据,并负责释放这些数据。&str 只是借用现有数据,不拥有任何内容。
fn main() {
let owned = String::from("data");
let view: &str = &owned[0..2];
println!("owned {} view {}", owned, view);
}在两者之间转换
可以相互转换:
&str转为String:使用.to_string()或String::from。String转为&str:使用&s或s.as_str()。
fn main() {
let s = String::from("convert");
let slice: &str = s.as_str();
let back: String = slice.to_string();
println!("{} {}", slice, back);
}快速检查
回顾这两种文本类型之间的区别。
总结
Rust 中的字符串:
String— 拥有所有权、可增长且分配在堆上的字符串。&str— 借用的切片或视图,也是字符串字面量的类型。- 使用
String::from或to_string()创建;使用push_str增长。 - 函数参数优先使用
&str。
fn main() {
let mut msg = String::from("Rust");
msg.push_str(" rocks");
let view: &str = &msg;
println!("{} ({} bytes)", view, view.len());
}常见问题解答
「字符串与 &str」课时是免费的吗?
是的 — 「字符串与 &str」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「字符串与 &str」这节课中我会学到什么?
拥有所有权的文本与借用的文本 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「字符串与 &str」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。