如果Rust str是不可变的,为什么我可以声明一个str变量是可变的?

o2rvlv0m  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(151)

根据:https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/strings.html
rust 字符串是不可变,且不能在需要可变性时使用。
但是,下面的程序可以编译并工作

fn main() {
    let mut mystr = "foo";   
    mystr = "bar";    
    {
         mystr = "baz";      
    }
    println!("{:?}", mystr);  
}

有人能解释一下Rust中str的易变性吗?
我预计let mut mystr = "foo";会导致编译错误,因为Rust中的str是不可变的。但是它可以编译。

yqkkidmi

yqkkidmi1#

你没有改变字符串本身。&str基本上就是(*const u8, usize)-一个指向缓冲区的指针和一个长度。当改变&str类型的变量时,你只是用另一个指针替换了一个指针,而 * 没有 * 改变原来的缓冲区。字符串常量的不变性意味着缓冲区实际上是链接到你的二进制文件的(而且,我记得,它包含在.rodata中),所以你不能改变它的内容。要真正改变一个字符串,使用一个堆分配的字符串-String

相关问题