使用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
相关产品推荐
相关产品推荐

