《 Rust》一书中的引用和借用说明

时间:2019-06-22 01:58:03

标签: rust

我正在阅读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()
}

Figure 4-5: A diagram of &String s pointing at String s1

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

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

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

这是解释上面代码的图(图4-6): String slice referring to part of a String

现在我想我的问题是,在“字符串切片”案例中,为什么world不是指s?我了解world不能仅指向s,因为那样一来它就无法获取最后5个字母。但是,这两个图对我来说似乎完全不同,但是它们都是“参考”。有人可以提供一种逻辑的方式来理解它吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

那么,&[mut] String在安全的上下文中有什么保证?

  • 指针后面有一个String,因此支持您的第一个图表。

那么,&[mut] str在安全上下文中可以保证什么?

  • String相同的想法是,指针后面有str。但是,这是什么意思? str到底是什么?

根据文档页面:

  

&str由两个部分组成:一个指向某些字节的指针和一个长度。

意思是&str确实是指向某个有效utf-8和长度的指针,所以str实际上是数据本身,而不是 StringString可以视为可操作的str。因此,&my_string[..]实际上是指向String下数据的指针/引用。

答案 1 :(得分:0)

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

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

另外,you can use an actual parameter of type &String for a string slice

  

字符串实现Deref,因此继承了所有str的   方法。此外,这意味着您可以将String传递给   该函数使用&符(&)来获取&str

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

  

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