首页 > 解决方案 > 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()
}

图 4-5:&String s 指向 String s1 的示意图

但是在String Slices中,该图清楚地表明world引用了实际数据,尽管只是其中的一部分。它还说,以下代码“类似于引用整个字符串,但带有额外的 [0..5] 位。它不是对整个字符串的引用,而是对字符串的一部分的引用。”

fn main() {
    let s = String::from("hello world");

    let hello = &s[0..5];
    let world = &s[6..11];
}

这是解释上述代码的图表(图 4-6): 引用字符串的一部分的字符串切片

现在我想我的问题是为什么在 String Slices 案例中没有world提到?s我知道这world不能仅仅指向,s因为那样它将无法获得最后 5 个字母。但这两张图在我看来完全不同,但它们都是“参考”。有人可以提供一种合乎逻辑的方式来理解它吗?

谢谢!

标签: rust

解决方案


对字符串的引用和字符串切片是不同的东西,因此它们的表示方式不同是正常的。

大多数情况下,字符串切片更有用,因为您可以引用子字符串,这使其更加灵活。通常,用于读取某些字符串数据的函数参数应该是字符串切片,而不是对字符串的引用。

此外,您可以为字符串切片使用类型的实际参数&String

字符串实现了 Deref,因此继承了 str 的所有方法。此外,这意味着您可以通过使用与号 (&) 将字符串传递给接受 &str 的函数

切片不能做的一件有用的事情是增加字符串的大小,在这种情况下,您需要对字符串的可变引用。一个示例是read_line函数,它将字符串数据附加到buf

pub fn read_line(&self, buf: &mut String) -> Result<usize>


推荐阅读