DevCN
菜单
全部文章快讯开发深度热点

Rust 入门:借用任务标题并保留字符串所有权

用 String 与字符串切片组织中文任务标题,借用读取后继续修改原值,并区分 UTF-8 字节长度和字符迭代数量。


本节目标

用 String 与字符串切片组织中文任务标题,借用读取后继续修改原值,并区分 UTF-8 字节长度和字符迭代数量。

环境与运行方法

保存为 lesson.rs,使用 Rust 工具链执行 rustc --edition=2021 lesson.rs -o lesson,然后运行 ./lesson。代码也可放进 Cargo 项目的 src/main.rs。

核心思路

String 拥有可增长文本,&str 是借用的文本视图。只读函数通常无需取得整个 String 的所有权,接收 &str 可以减少不必要的复制。len 返回字节数,chars().count() 统计 Unicode 标量值。

完整示例

fn describe(title: &str) {
    println!("bytes={} chars={}", title.len(), title.chars().count());
}
fn main() {
    let mut title = String::from("学习Rust");
    describe(&title);
    title.push_str("!");
    println!("{}", title);
}

预期输出

bytes=10 chars=6
学习Rust!

逐步理解

let mut 允许追加文本。describe 只借用标题,调用结束后所有权仍在 main,因此可以继续 push_str。两个汉字占六个 UTF-8 字节,四个英文字母占四个字节,所以总数为十。

借用没有长期保存,生命周期很直接。复杂结构中若同时保留共享借用并尝试可变借用,编译器会阻止冲突。字符迭代数量也不等于所有情况下的人眼字形数。

常见问题与边界

  • 把参数改为 String 并传入原值会移动所有权。
  • 字符串不能按整数索引直接取得 Unicode 字符。
  • 到处 clone 会掩盖数据所有权问题并增加复制成本。

动手练习

把标题改为 Rust入门,预测两种长度。

参考答案

仍有四个 ASCII 字母与两个汉字,结果仍是十字节、六个标量值,追加后显示 Rust入门!。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。