string - 为什么 str 主要以借来的形式存在?
问题描述
这是该str
类型的使用方式:
let hello = "Hello, world!";
// with an explicit type annotation
let hello: &'static str = "Hello, world!";
let hello: str = "Hello, world!";
导致expected `str`, found `&str`
为什么文本的默认类型不仅str
不同于所有原始类型、向量和String
? 为什么是参考?
解决方案
字符串和切片只能通过引用访问的设计决策有很多优点:
- 字符串可以有任意长度。因此,类型的变量
str
在堆栈上不容易管理,而&str
只有堆栈上指针的大小(而可变长度数据驻留在堆上)。请注意,所有其他原始类型都有固定长度,每个引用都有固定长度(不是它指向的数据)和每个结构(这是一个组合)。 &str
是一个不可变的引用。如果您可以定义类型的变量,str
则必须为let mut s: str = "str";
. 堆栈上的不可变字符串很难管理,可以附加的字符串更难。- 拥有
str
意味着每一步都必须复制所有字符,这会降低性能。只是复制引用并在堆上保持引用数据不变更便宜。这并不是真正的零成本抽象。 str
不是唯一仅作为参考出现的类型&str
(对于切片同样适用,例如&[i8]
),因此对字符串处理的更改会使其他行为变得奇怪(或者必须相应地更改)。- 让我们假设一个函数可以管理 type 的变量
str
。现在你想&str
从这个函数中返回一个。这是行不通的,因为引用最多只存在于它指向的值(尝试使用任何原始类型)。由于str
是本地创建的值,因此它不能超过功能。字符串文字始终是对静态字符串的引用的便利解决了这个问题。这意味着您必须编写额外的代码来将您拥有str
的变量放入静态变量中,这样您就可以返回&str
. 由于静态引用是我需要的默认行为,因此我可以用很少的开销编写它非常方便。
推荐阅读
- javascript - How to call resolve after a promise is fulfilled
- azure - 如何从 Azure 云外壳运行 yaml 文件
- python - 如何将新变量添加到对象中以在类中使用
- python - 如何迭代列表并将字典附加到另一个列表
- python - 有什么方法可以在 python 或 ruby 中获得 GoogleDriveAPI 支持的导出 MIME 类型列表?
- javascript - 在 facebook 上分享帖子或提要后是否有可能得到回应?
- python - 变量R在if循环中作为字符串返回?
- c++ - 我的程序没有运行就退出了,返回值 3221225620
- reactjs - 反应本地工作区设置以连接到 REST API 服务器
- architecture - Apache Superset 的架构