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"
的区别,它允许改变字符串切片,即使 s
是 not 标记为可变的。
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 也可能是有助于理解指针的有用资源。
我目前正在尝试了解 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"
的区别,它允许改变字符串切片,即使 s
是 not 标记为可变的。
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 也可能是有助于理解指针的有用资源。