Rust:如果 &str 应该是指向硬编码二进制文件的指针,那么为什么我可以让它可变并在运行时更改它?

Rust: If &str is supposed to be a pointer to hardcoded binary than why can I make it mutable and change it during runtime?

我目前正在尝试了解 Rust 中 &str、str 和 String 之间的区别。我对编程语言很陌生,并且已经为此苦苦思索了一段时间。我的想法是 String 有一个长度和存储在堆栈上的指针,并且指针指向堆上的一些数据,其中包含字符串数据。我还知道它存储在堆上,因为我们不知道它的字符串数据在运行时会占用多少内存,因此它不能存储在堆栈上。对于 str,我知道它是一个二进制的硬编码值,这意味着它必须是不可变的,我们唯一能得到它的方法是引用:&str。如果 &str 必须是不可变的。那么为什么下面的代码不会导致编译器错误呢?请帮忙。我已经在互联网和这个网站上搜索了几个小时,但找不到答案。

let mut s: &str = "foo";

s = "foobar";

在此示例中,可变的不是 str,而是 &
s 正在存储对某些 str 的引用,s = "foobar" 在同一位置 s.
存储对不同 str 的不同引用 注意与 let s: &mut str = "foobar" 的区别,它允许改变字符串切片,即使 snot 标记为可变的。

str 本身是不可变的,但 &str 是对字符串的引用。当您执行 s = "foobar" 时,您正在使 s 指向不同的字符串。这是一个示例,有望说明这一点... rust playground.

fn main() {
    let mut s: &str = "foo";
    let p = s;
    s = "foobar";
    println!("{:?}", p);
    println!("{:?}", s);
}

rust book on pointers 也可能是有助于理解指针的有用资源。