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

为何Rust中字符串字面量切片操作返回str而非&str?

Rust中str与&str的常见疑问解答

先搞清楚核心区别

  • str是Rust里的动态大小类型(DST),编译时没法确定它的大小,所以你根本没法直接定义一个str类型的变量,必须用引用(比如&str)把它包起来才能用。
  • 你看到"hello"[..]或者"hello"[1..3]的类型标注是str,但实际代码里编译器会自动把它转成&str——不然你根本没法用这个值,总不能拿着一个大小不确定的类型直接操作吧?

关于内存结构的问题

  • &str确实是字节指针+长度的结构:指针指向字符串的起始字节,长度记录了这个切片包含多少字节(注意是字节,不是字符,因为Rust字符串是UTF-8编码的)。
  • 而str本身就是一段连续的UTF-8字节序列,它自己不带指针和长度——那些元数据都是由&str这个引用类型来保管的。
  • 你猜的切片操作逻辑是对的:如果a是一个指向字节指针p、长度为l的&str,那a[s..e]得到的新&str,就是指针指向p+s的位置,长度为e-s的结构。

为啥文档里大多只提&str?

因为str作为DST几乎没有直接使用的场景,所有字符串相关的操作都是通过&str来做的。文档肯定优先讲实际能用的类型,所以你会看到大量&str的说明,str更多是作为底层的基础类型存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:54:55