rust - The Rust book 的参考和借用说明
问题描述
我正在阅读 Rust 书,第 4 章中的参考和借用似乎与我不一致。在Reference and Borrowing中,下面的图 4-5 显示了s
指向s1
而不是堆上的实际数据。
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
但是在String Slices中,该图清楚地表明world
引用了实际数据,尽管只是其中的一部分。它还说,以下代码“类似于引用整个字符串,但带有额外的 [0..5] 位。它不是对整个字符串的引用,而是对字符串的一部分的引用。”
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
}
现在我想我的问题是为什么在 String Slices 案例中没有world
提到?s
我知道这world
不能仅仅指向,s
因为那样它将无法获得最后 5 个字母。但这两张图在我看来完全不同,但它们都是“参考”。有人可以提供一种合乎逻辑的方式来理解它吗?
谢谢!
解决方案
对字符串的引用和字符串切片是不同的东西,因此它们的表示方式不同是正常的。
大多数情况下,字符串切片更有用,因为您可以引用子字符串,这使其更加灵活。通常,用于读取某些字符串数据的函数参数应该是字符串切片,而不是对字符串的引用。
此外,您可以为字符串切片使用类型的实际参数&String
:
字符串实现了 Deref,因此继承了 str 的所有方法。此外,这意味着您可以通过使用与号 (&) 将字符串传递给接受 &str 的函数
切片不能做的一件有用的事情是增加字符串的大小,在这种情况下,您需要对字符串的可变引用。一个示例是read_line
函数,它将字符串数据附加到buf
:
pub fn read_line(&self, buf: &mut String) -> Result<usize>
推荐阅读
- kubectl - 从 kubectl 使用 kustomize 时如何设置负载限制器?
- python - Flask 如何热重载 Uwsgi 每个工人单例值?
- python - AWS SageMaker Feature Store 如何知道在摄取数据时要执行哪些转换?
- python - 创建一个子图网格,其中一个子图完全被图例填充
- docker - 如果将使用 Kubernetes 等编排工具进行部署,那么集群 NodeJ(以利用多个 CPU)是否有意义?
- python - 使用missingno但得到不正确的结果
- java - Checkout 与文件冲突:使用 Mockito 编写单元测试时
- laravel - Laravel 会话有价值
- reactjs - 如何切换仍在手风琴中打开的那个[React,Hooks]
- pdf - 在没有用户密码的情况下,Mac OS 10.15.7 上的 PDF 打印锁定被破坏