10-Rust难点攻关

切片、字符串、Eq 等等价与比较概念精要辨析

精要笔记 · 基于 Rust语言圣经「Rust 难点攻关」

Rust 难点攻关

学至此处,以下概念是否说得清、用得上?

  • 切片 vs 切片引用
  • String / str / &str 等字符串类型
  • 裸指针 / 引用 / 智能指针(源码待补)
  • move / Copy / Clone(源码待补)
  • 作用域 / 生命周期 / NLL(源码待补)

本章整理已有解读;标注「待补」的小节见源码目录 shengJing/_src/src/difficulties/。

切片和切片引用

前置:切片 slice

str、[T] 均为切片(DST,编译期大小未知),不能直接作为栈上变量使用:

1
let string: str = "banana"; // 编译错误:size not known at compile time

结论:切片只能通过引用使用;口语中的「字符串切片」通常指 &str。

切片(DST)常用引用
str&str
[T]&[T]

要点:

  • 切片长度运行时确定 → 类型为 DST
  • 切片引用是宽指针(指针 + 长度),大小固定,可存栈上
  • 固定长度用数组:[i8; 4],类型含长度,非切片
1
2
3
let s1: &str = "banana";
let s2: &str = &String::from("banana");
let s3: &[i32] = &[1, 2, 3, 4, 5][1..3];

Eq 和 PartialEq

== / != 需实现 PartialEq;Eq 是标记 trait(无方法),表示所有值均可相等。

1
2
3
4
impl PartialEq for Book {
    fn eq(&self, other: &Self) -> bool { self.isbn == other.isbn }
}
impl Eq for Book {}  // 在 PartialEq 之上默认实现

Partial = 部分相等:浮点数实现 PartialEq 但未实现 Eq,因 NaN != NaN:

1
2
3
let f1 = f32::NAN;
let f2 = f32::NAN;
assert!(f1 != f2);  // 两者均为 NaN,但不相等
trait含义典型约束
PartialEq可比较相等一般类型
Eq完全相等HashMap 的 K
PartialOrd可部分排序浮点数
Ord全序BTreeMap 的 K

疯狂字符串

Rust 字符串类型易混,核心对照:

类型所有权可变性常见场景
str——DST,不可直接使用
&str借用否字符串字面量、函数参数
String有是堆上可增长 UTF-8 字符串
&String借用视内部少见,通常用 &str 即可
Box<str>有否固定堆上字符串
  • str 是语言内置的字符串切片;String / &str 是日常说的「字符串」
  • 标准库还有 OsStr/OsString、CStr/CString 等,对应 OS/FFI 场景
  • str 硬编码进二进制;String 可增长、可修改

待补专题(见源码)

以下章节在源仓库中为占位或 TODO,完整正文待后续补充:

  • 作用域、生命周期和 NLL → difficulties/lifetime.md
  • move、Copy 和 Clone → difficulties/move-copy.md
  • 裸指针、引用和智能指针 → difficulties/pointer.md
最后修改 July 30, 2026: 更新 (33710aaae)