You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Rust中可声明可变str变量?str本身为不可变类型

理解Rust中str的可变性与变量绑定的可变性

你这里的困惑其实是把变量绑定的可变性和**str类型本身的可变性**搞混啦!

先看你的代码:

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

核心区别要搞明白:

  • str(字符串切片)本身确实是不可变的:你永远没法修改"foo"这个字符串里的单个字符,比如尝试写mystr[0] = 'F'一定会编译失败——因为str的内容是固定的,不能被修改。
  • 你声明的mystr是一个可变的变量绑定:let mut修饰的是变量mystr,而不是它指向的str。这意味着你可以让mystr这个变量重新指向另一个不同的字符串切片(比如从"foo"换成"bar"再换成"baz"),但每一个字符串切片本身的内容依然是不可变的。

打个通俗点的比方:这就像你手里拿着一个可以换目标的遥控器(可变变量绑定),它可以指向不同的静态广告牌(str),但你没法涂改任何一块广告牌上的内容。

你可以自己验证一下:如果尝试修改str的内容,比如写这段代码:

fn main() {
    let mut mystr = "foo";
    mystr[0] = 'F'; // 这里会直接编译报错!
}

编译器会明确告诉你str是不可变的,无法修改其内部字符——这才是str不可变性的真正体现。

而你的代码只是改变了变量mystr的指向,并没有修改任何str的内容,完全符合Rust的规则,所以能正常编译运行。


内容的提问来源于stack exchange,提问作者Roshan Perera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:20:59