为什么字符串字面量没有被移动?

4

我正在阅读 Rust第二版电子书,在一个链接章节的代码片段中,如果我删除第3行的引用运算符 (&),程序仍可以完美地工作。

let mut s1 = String::from("foo");
let s2 = "bar";
s1.push_str(&s2); // here
println!("s2 is {}", s2);
的值应按照书中所述移动。但是,如果我更改
s1.push_str(&s2);

为了

s1.push_str(s2);

以下代码应该会触发错误,但实际上没有发生任何错误:
println!("s2 is {}", s2);

文档片段:

清单8-16:将字符串切片添加到字符串后使用 如果 push_str 方法拥有了 s2 的所有权,我们将无法在最后一行打印出其值。但是,这段代码按照我们的期望工作!

我正在使用 Rust 1.24.1。

1个回答

4
< p > push_str的签名是:

pub fn push_str(&mut self, string: &str)

这意味着它的参数是一个引用。这与s2的类型相匹配,它是一个指向静态字符串切片的引用:
let s2: &'static str = "bar";

编译器能够根据需要解引用push_str的参数,因此s1.push_str(s2)s1.push_str(&&&&&s2)一样有效。
由于最终总是传递一个引用,因此参数不会被移动(只是借用),并且在推送后s2仍然可用。

7
重要的部分是 &str: Copy,就像所有不可变引用一样。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接