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

为何Rust示例代码1的变量x仍有值而代码2的s2无有效取值

Rust两段代码运行差异原因解释

代码1可正常输出x的原因

代码1中的x是i32整型,属于Rust的基础标量类型,数据完全存储在栈空间,默认实现了Copy trait。
执行let y = x+1时,只会直接复制x在栈上的数值给新变量y,不会触发所有权转移,x本身的所有权没有发生任何变更,因此后续可以正常读取x的值。

代码2无法输出s2的原因

代码2中的s2是String动态字符串类型,数据分为两部分存储:元数据(指针、长度、容量)存在栈上,实际字符串内容存在堆上。String类型没有实现Copy trait,赋值时默认触发所有权转移(Move):

  • 仅拷贝s2栈上的元数据给新变量s4
  • Rust会自动标记原有变量s2为失效状态,避免两个变量同时持有同一块堆内存的引用、引发双重释放等内存安全问题
    此时s2已经失去对应堆内存的所有权,属于无效变量,编译器会直接禁止后续对s2的读取操作,因此无法正常输出。

可选解决方案

如果需要赋值后仍保留s2的有效性,可调用clone方法执行深拷贝,同时复制栈上元数据和堆上的字符串内容:

let mut s2 = String::from("Tôi tên là");
let s4 = s2.clone();
println!("{}",s4);
println!("{}",s2); // 可正常输出

内容的提问来源于stack exchange,提问作者phuc hung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:57:01