Rust引用的创建与比较机制及切片断言行为疑惑
问题解答
1. 切片引用的assert_eq!为何会通过?
Rust的assert_eq!不会直接比较引用的内存地址,而是会自动解引用引用类型,比较内部的值。这是因为标准库为所有实现了PartialEq的类型T,自动为&T实现了PartialEq,行为就是解引用后比较T的相等性。
对于切片&[T]来说,它的PartialEq实现是逐元素比较两个切片的内容——只要两个切片长度相同,且每个对应位置的元素都相等,assert_eq!就会通过。哪怕是两个不同数组的切片,只要内容一致,断言也能通过;而如果是同一数组的切片,它们本来就指向同一块内存区域,内容自然一致。
2. 可变切片修改后的断言行为原因
这和Copy-on-write完全无关——Rust的普通切片(&[T]和&mut [T])根本没有COW机制。
当你从数组创建可变切片slice2时,这个切片就是原数组的直接视图,修改slice2[0]本质上就是直接修改原数组的第一个元素。如果另一个切片slice1也指向同一个原数组,那slice1[0]的值会同步变化:
- 把
slice2[0]设为2时,原数组第一个元素变为2,slice1对应位置的值也变成2,两个切片内容完全一致,所以assert_eq!通过; - 设为6时,原数组元素变为6,若此时另一个切片的对应元素内容不同,两个切片内容不一致,断言就会失败。
3. 官方文档说明
- 引用类型的
PartialEq实现:标准库中PartialEqtrait的文档明确提到,当T: PartialEq时,&T和&mut T会自动实现PartialEq,行为是解引用后比较T的相等性。 - 切片的
PartialEq:切片[T]的PartialEq实现文档说明,它会逐元素比较两个切片的内容,要求长度相同且每个对应元素都相等。 - 切片的本质:Rust官方文档明确说明,切片是包含指向数据的指针和长度的结构体,它不拥有数据,只是原数据的视图,修改可变切片会直接操作原数据。
内容的提问来源于stack exchange,提问作者JoulinRouge
相关产品推荐
相关产品推荐

