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

使用push_str()链式拼接字符串时Rust为何未报错?

为什么第一段代码没有触发panic或编译错误?

核心原因很简单:push_str方法的返回值是单元类型(),而非修改后的String。

拆解第一段代码

let mut s = String::from("abc").push_str("x");
println!("{:?}", s); // Prints ()
  • String::from("abc")会生成一个临时的String实例。
  • 调用push_str("x")时,这个方法会直接修改该临时String的内容,但它的设计是通过可变引用操作自身,返回值为()(Rust中很多原地修改的方法都遵循这个设计,比如Vec的push)。
  • 因此,let mut s = ...这行代码本质是把()赋值给了变量s,这里的mut修饰符没有实际意义(因为()是不可变的单元值)。
  • 最后打印s时,输出()完全符合Rust的语法规则,所以既不会触发编译错误,也不会运行时panic,只是结果和你预期的String不符。

对比第二段代码

let mut s = String::from("abc");
s.push_str("x");  
println!("{:?}", s); // Prints "abcx"
  • 这里先将一个可变的String实例绑定到s,然后调用s.push_str("x"),方法通过可变引用直接修改s指向的String内容。
  • 因为s是mut可变绑定,所以操作合法,最终打印的就是修改后的String,符合你的预期。

如果你想通过链式调用得到修改后的String,可以选择+运算符(需要注意所有权问题)或者format!宏,比如:

let s = String::from("abc") + "x";
println!("{:?}", s); // Prints "abcx"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:45:06