为何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
相关产品推荐
相关产品推荐

