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

Rust中String存于堆上,为何执行push操作需标记mut?

Rust中String修改需声明mut的机制解析

首先要明确:Rust的变量可变性是「绑定层面」的限制,和数据存在堆还是栈没有直接关系。

String确实是堆分配的动态字符串类型,内部包含指向堆内存的指针、当前长度和容量,本身具备修改自身内容的能力(比如push_str这类方法就是用来扩展字符串的)。但Rust的默认规则是:所有变量绑定默认是不可变的——意思是,你不能通过这个变量去修改它所指向的数据,哪怕数据本身是可变类型。

看你给出的代码:

fn ct(input: &str) -> String {
    let result = input.to_string();
    result.push_str(" world"); // 这里报错
    result
}

push_str方法的签名是fn push_str(&mut self, string: &str),它要求调用者必须是一个可变借用(&mut self)。但你声明的result是不可变绑定,Rust不允许从不可变绑定中产生可变借用,所以编译器直接报错,提示你把变量改成let mut result。

这种设计是Rust的核心安全特性之一:默认不可变的规则能避免很多意外修改数据的bug,让代码的意图更清晰——只有当你明确需要修改某个变量指向的数据时,才主动加上mut声明,编译器也会基于这个声明,帮你检查所有对该变量的操作是否符合可变权限的要求。

内容的提问来源于stack exchange,提问作者bozi young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:27:40