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



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

let mut s: &str = "foo";
s = "foobar";

str本身是不可变的,但&str是对字符串的引用。当你做s = "foobar"s指向一个不同的字符串。这里有一个例子,希望能说明这一点......锈操场。

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

关于指针的 rust 书也可能是理解指针的有用资源。

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

相关内容

  • 没有找到相关文章

最新更新