You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现:标准库中PartialEq trait的文档明确提到,当T: PartialEq时,&T和&mut T会自动实现PartialEq,行为是解引用后比较T的相等性。
  • 切片的PartialEq:切片[T]的PartialEq实现文档说明,它会逐元素比较两个切片的内容,要求长度相同且每个对应元素都相等。
  • 切片的本质:Rust官方文档明确说明,切片是包含指向数据的指针和长度的结构体,它不拥有数据,只是原数据的视图,修改可变切片会直接操作原数据。

内容的提问来源于stack exchange,提问作者JoulinRouge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:05:16